Flyway数据库版本管理工具的使用

  在团队开发当中,有可能每个人都是使用自己本地的数据库。当数据库的表或者字段更新时,往往需要告知团队的其他同事进行更新。我记得第一个项目进行字段管理的时候是将自己的脚步拿出来放到项目某个文件夹下面,如果结构变了告诉其他同事拉下来之后执行下脚本文件。还有一种方式是改完之后告诉其他人哪个表字段做了改动,脚本都没放,这种方式也使用过···

  Flyway数据库版本迁移工具可以解决该问题。每当我们更新数据库的时候,只需要添加SQL文件到指定目录中。

  Flyway的流程大概是在数据库创建一个表,专门记录已更新的SQL文件。当我们下次执行时则不会执行已记录并且执行成功的SQL文件,如果没有执行过sql脚本会执行脚本并且记录到自己的表中。这种方式对开发、对线上系统的升级就非常方便了。当然flyway还有其他非常方便的功能,都是可以配置的。

github地址:https://github.com/flyway/flyway

官网地址:https://flywaydb.org/

  而且我记得之前在一个项目是mybatisPlus些的,为了便于建表还引入了JPA进行建表,其实用flyway也可以,放一个初始化脚步,系统启动的时候自动执行脚步即可。

  flyway使用可以命令行、Java、Maven等,也和spring做了整合。下面研究在springboot项目中的使用。

1. pom引入相关依赖

        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
            <version>6.3.3</version>
        </dependency>

2.application配置

# FLYWAY (FlywayProperties)
spring.flyway.url = jdbc:mysql://127.0.0.1:3306/media?useUnicode=true&characterEncoding=UTF-8
spring.flyway.user = root
spring.flyway.password = 123456
# 存放flyway信息的表
spring.flyway.table = flyway_schema_history
spring.flyway.enabled = true
# 存放数据库脚本的位置
spring.flyway.locations = classpath:db/migration
spring.flyway.clean-disabled = false
spring.flyway.baseline-on-migrate = true
# 允许乱序执行
spring.flyway.out-of-order= true
# 前缀后缀
spring.flyway.sql-migration-prefix=V
spring.flyway.sql-migration-separator=__
spring.flyway.validate-on-migrate=false

  上面配置了数据库连接信息;

  spring.flyway.table 指定存放flyway记录版本信息的表;

  spring.flyway.locations 指定存放脚本文件的位置。classpath在boot项目中就是resources目录

  sql-migration-prefix和sql-migration-separator指定版本前缀和版本号和描述的分隔符

关于更多的配置参考:https://flywaydb.org/documentation/configuration/configfile

3. 建立sql文件

 这里说明下sql文件的命名。V版本号__描述.sql  版本号默认是1 (注意这里的下划线是两个),而且版本号不能重复。描述就是你本次sql改动是做什么了简单说明下。

4.启动项目自动建表

  启动项目可以看到自动建的表。

 test是从脚本中读出来的,flyway_schema_history是flyway运行自身所需要的表,用于记录处理过的数据表。查看数据如下:

 5.执行第二个SQL

如果这时候你想删掉test表,你删掉表   V20201106001__创建test表.sql  是没用的,因为flyway已经处理过该文件,不会进行处理。解决办法就是加一个文件做一个逆向的操作。如下:

在db/migration目录下新建第二个SQL文件,名称为: V20201106002__删除test表.sql ,内容如下:

drop table test

启动项目让flyway执行脚本。

再次查看数据表test已经删除

 查看flyway_schema_history表的数据如下:

 

补充:flyway 脚本执行失败的话会导致服务启动失败,success 为 0 的时候,修改正确之后不会重新加载脚本,需要删掉flyway记录表的那条数据。

补充:flyway 启动会校验已经执行过的脚本,如果校验失败会导致启动失败,解决方法可以是修改数据表的checksum 值为日志打印的解析出来的新值。 

补充: 关于源码

  flyway 自动配置在org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration 类。

  核心逻辑是在:org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer#afterPropertiesSet 后置处理器然后转交给核心类 org.flywaydb.core.Flyway里面。做操作的入口是org.flywaydb.core.Flyway#migrate -》 org.flywaydb.core.Flyway#execute, 会进行一系列的解析验证、然后执行sql 脚本。

 

posted @ 2020-11-06 21:45  QiaoZhi  阅读(1058)  评论(0编辑  收藏  举报