最近想给项目添加数据库版本管理工具Flyway,花了几天时间研究了一下,本文将从一个初学者的角度使用Flyway。
一、Flyway介绍
Flyway是一个开源的数据库版本管理工具,它通过创建历史记录表来跟踪数据库状态,实现自动化迁移。Flyway以其简单、专注和强大的特点,帮助开发团队轻松管理数据库的变更和版本控制。
刚开始看到这些描述的时候总感觉懵懵的,理解不了Flyway的用处,其实通俗的说,Flyway就是为了保证开发环境和生产环境的表结构一致,防止因为开发环境中修改表结构而忘了在生产环境中修改表结构而造成的错误;同时Flyway也可以对数据库版本进行管理,在需要时可以根据执行记录回滚(不过亲测社区版没有这个功能,需要使用pro版)。
二、Flyway的工作流程
1.项目启动时,程序会自动执行指定路径(默认是 :db/ )下的sql文件。
2.第一次执行时,会创建一个名为 y 的表,用于记录数据库的版本信息,当数据库非空时,会自动生成基线(需在配置文件中开启)。
3. Flyway会根据文件名按版本号从小到大依次执行。
三、Flyway环境搭建
1.在pom文件中引入依赖(注意是当前模块的pom文件)
<dependency>
<groupId>org.flywaydbgroupId>
<artifactId>flyway-coreartifactId>
<version>6.1.0version>
dependency>
2.yaml文件中添加相关配置
flyway:
# 是否启用flyway
enabled: true
# 编码格式,默认UTF-8
encoding: UTF-8
# 迁移sql脚本文件存放路径,默认db/migration

locations: classpath:db/migration
# 迁移sql脚本文件名称的前缀,默认V
sql-migration-prefix: V
# 迁移sql脚本文件名称的分隔符,默认2个下划线__
sql-migration-separator: __
# 迁移sql脚本文件名称的后缀
sql-migration-suffixes: .sql
# 迁移时是否进行校验,默认true
validate-on-migrate: true
# 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
baseline-on-migrate: true
3.若需要使用Flyway插件,还需加入插件的依赖,非必须。
<build>
<plugins>
<plugin>
<groupId>org.flywaydbgroupId>
<artifactId>flyway-maven-pluginartifactId>
<version>5.2.4version>
<configuration>
<url>jdbc:mysql://localhost:3306/flyway-demo?characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghaiurl>
<user>rootuser>
<password>rootpassword>

<driver>com.mysql.cj.jdbc.Driverdriver>
configuration>
plugin>
plugins>
build>
四、Flyway使用方法
(1)新建sql文件
需要更改表结构或数据时,不要直接在数据库管理工具(如Navicat)中更改,而是采用写sql语句的方式。
在路径/db/下新建sql文件(需严格按照文件命名规则),根据需求写sql语句,然后启动项目即可,flyway会自动执行sql文件并将该版本记录在表y中。
(2)sql文件命名规则
sql文件命名需要严格按照命名规则,且版本号递增的方式命名。
1.仅需要被执行一次的sql命名以大写的"V"开头,V+版本号(版本号的数字间以"."分隔开)+双下划线(用来分隔版本号和描述)+文件描述+后缀名。为避免命名冲突且保证版本号递增,版本号尽量采用 年月日时分秒 进行命名。例:假如当前时间是2024年8月27日15时59分18秒,需求是新建表,则文件命名为:
V2024.8.27.15.59..sql。
若执行失败,可尝试修改文件名中的版本号,修改为执行时时间。
文件一旦被执行不允许再次修改,若有新需求需重新创建sql文件。
2.可重复运行的SQL,则以大写的“R”开头,后面再以两个下划线分割,其后跟文件名称,最后以.sql结尾。比如: .sql 。文件每次被修改都会重新执行。
五、可能遇到的问题
1.如果报错,可以检查数据库名称、用户名、密码等是否正确;
2.报错还可能的原因是依赖冲突问题,我报的错是不支持MySQL5.7版本,实际上是不知道在哪里已经有了一个Flyway8.x的依赖,跟我引入的6.1.0版本产生了冲突,只需在父pom文件中加入依赖强制使用6.1.0版本即可解决。
3.有可能执行没有报错,但是就是执行没有效果,我也不知道是什么原因,试了几个只有6.1.0可以生效,所以可以尝试切换Flyway的版本解决。
4.还有一种情形:多人协作时,假设A和B都新建了sql文件,A的版本低于B,A执行项目后,数据库记录了该版本,但是A还没来得及提交代码到git上,B执行项目时会因为缺少A的sql文件而报错,若想要避免报错,可以在配置文件中将
flyway.ignore-missing-设置为true。
*请认真填写需求信息,我们会在24小时内与您取得联系。