1。飞路是什么?我们都知道Git/SVN是代码世界的版本控制工具,那么Flyway是数据库世界的版本控制工具,可以记录数据库的变化。许多公司可能会手动维护和同步数据库脚本,但经常会遇到疏忽和遗漏。我举一个简单的例子:我们在开发环境中给一个表添加了一个字段,但是在提交测试的时候,却失败了。忘记提交SQL脚本,导致bug和测试中断,从而影响开发和测试效率。有了Flyway,我们可以按照版本协议统一管理所有的SQL脚本变更,自动同步所有环境下的数据库,无需人工控制,再也不用担心数据库不同步导致的各种环境问题。官网:https://flywaydb.org/支持的数据库:支持的操作方式:支持7条命令:Migrate(迁移)Clean(清理所有配置的对象)Info(显示迁移状态和详情)Validate(验证迁移规则)Undo(undorecentmigration)Baseline(建立基线)Repair(修复迁移历史表)2.SpringBoot集成FlywayFlyway有社区开源免费版和商业版。本文以开源社区免费版和JavaAPI的运行方式为例演示FlywayMigrate的功能。1、引入对Flyway的依赖,几乎是零依赖。最低要求是:JDK1.7+JdbcDriverSpringBoot基础教程就不介绍了。栈长之前写了很多,就不关注了公众号:Java技术栈,后台回复:boot,历史上的SpringBoot实战教程我都整理了。本文演示环境:JDK1.8SpringBoot2.5.0MySQL8.0IntelliJIDEA2021.1这里只展示除SpringBoot以外的核心依赖:org.springframework.bootspring-boot-starter-data-jdbcmysqlmysql-connector-java8.0.21org.flywaydbflyway-core7??.10.02.添加配置SpringBoot默认提供了Flyway的自动配置:org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration所以,对于SpringBoot项目,我们只需要提供相应的配置参数:spring:datasource:driver-class-name:com.mysql。cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/flywayusername:flywaypassword:12345678flyway:locations:-classpath:flywaytable:t_flyway_history版本注意:SpringBoot2.5及以上版本,如果使用spring.flyway.url定义,需要添加用户名/密码进行鉴权。如果是第一次使用Flyway,需要在资源目录下创建指定的配置文件,Flyway迁移目录:resources/flyway。Flyway也是一种约定大于配置的思想。以上Flyway相关配置可以说是零配置。它们都有默认值:spring.flyway.locations:classpath:db/migration,用于扫描spring的迁移脚本目录。flyway.table:flyway_schema_history,用于记录所有的版本变化。更多Flyway参数配置可以参考这个类:org.springframework.boot.autoconfigure.flyway.FlywayProperties另外,最好创建一套Flyway专用的数据库表,与用户、业务表、用户分开,权限最小化.三、迁移实践1、创建迁移脚本然后在该目录下创建迁移脚本。迁移脚本文件命名规则为:V__.sql注意:版本号后加两个下划线。比如栈长第一次创建了三个迁移脚本:V1.0.0__create_javastack.sqlV1.0.1__insert_javastack.sqlV1.0.2__update_javastack.sql首先创建一个表,然后插入几条记录,然后更新记录,具体的SQL脚本内容就不贴了,完整的示例代码已经提交到Github:https://github.com/javastacks/spring-boot-best-practiceOK,SpringBoot集成Flyway和相关脚本都写完了,可以说不能再简单了,我们启动系统来验证脚本是否已经执行。1)首次启动从启动日志可以看出迁移了3个脚本,当前版本已经更新到v1.0.2:查看数据库,Flyway历史表和业务表也已经创建:可以可以看到历史表已经记录了3个脚本的迁移细节,业务表的数据已经插入更新了:2)不修改重启不修改任何代码重启:3个迁移脚本验证成功,并且打印当前版本号。但是没有迁移,为什么?因为三个脚本都被迁移了,主要是版本号小于等于当前版本号:1.0.2,所以不会进行迁移。3)修改并重新开始。我们再添加两个SQL脚本:V1.0.3__alter_javastack.sqlV1.0.4__update_javastack.sql首先添加note和time两个字段,然后更新相应的数据。重头再来:迁移成功,当前版本已经来到v1.0.4。检查数据库:注释和时间字段已创建并更新。2、创建重复的迁移脚本从上面的例子我们知道,只有目录下的SQL脚本的版本号大于当前版本号,才会执行迁移,脚本全部一次性执行.如何实现可重复迁移?Flyway支持Repeatable迁移脚本,可重复迁移脚本的文件命名规则为:R__.sqlR(Repeated),即:repeatable。这里我创建了一个更新note和time字段的迁移脚本:R__update_javastack.sql1)第一次启动,再次启动:从上面的截图可以看出,重复的迁移脚本也执行成功了。2)如何判断不修改重启是否可以重复迁移?我们不修改任何代码,重启:说明不需要迁移!!那是因为我们没有对重复的迁移脚本做任何修改,所以系统不会迁移!3)修改并重新开始我们再改一次脚本,在注释后加一个ok,重新开始:脚本已修改并且再次迁移成功,说明可重复的迁移脚本也需要修改才能再次迁移,Flyway会将脚本进行比较。最后贴上迁移脚本目录:这里我是放在一个目录下做演示的。实际开发中,可以放在多个目录下,以区分维护。4、迁移过程OK,我们来梳理一下迁移过程:1)Flyway会扫描配置的脚本目录下的脚本文件;2)如果历史表不存在,则新建一个历史表;3)如果是一次性执行脚本(V),则按照版本号从小到大执行迁移脚本,并与当前历史表中的版本号进行比较。只会迁移大于当前版本号的脚本;4)如果脚本可以重复执行(R),检查脚本是否有变化,只有可重复脚本有变化才会执行迁移;FlywayMigrate迁移流程图:来源官网此外,我们也可以手动删除迁移历史表中的迁移记录,达到一次性脚本再次执行的目的,但不推荐在生产环境中使用。5.总结使用Flyway可以轻松处理数据库表结果和数据版本迁移。它使用简单且自动化,极大地提高了生产率。它不再需要在控制台上手动完成,这更容易出错或遗漏。经常出错。本文使用JavaAPI方式,在项目启动时进行迁移。还有另外三种方法,文章之前已经介绍过了,大家可以根据自己的实际需要来使用。本文只是介绍。只介绍Flyway中的Migrate(迁移)环节,这也是Flyway中最重要的环节。还有其他6个链接。后续栈长会及时分享。敬请关注公众号Java技术栈,公众号尽快推送。本文完整的示例代码已经上传到Github:https://github.com/javastacks/spring-boot-best-practice更多细节请参考官方文档:https://flywaydb.org/documentation/最后,你用过Flyway或者相关工具吗?欢迎分享经验~本文转载自微信公众号“Java技术栈”,可通过以下二维码关注。转载本文请联系Java技术栈公众号。