个人主页: 【⭐️个人主页】
需要您的【 点赞+关注】支持
本文核心知识点:
https://flywaydb.org/
我们都知道,Git/ SVN 是代码界的版本控制工具,那么,Flyway 就是一款数据库界的版本控制工具,它可以记录数据库的变化记录。
Flyway是一个简单开源数据库版本控制器(约定大于配置),主要提供migrate、clean、info、validate、baseline、repair等命令。它支持SQL(PL/SQL、T-SQL)方式和Java方式,支持命令行客户端等,还提供一系列的插件支持(Maven、Gradle、SBT、ANT等)。
可能很多公司都是通过人工去维护、同步数据库脚本,但经常会遇到疏忽而遗漏的情况,举个简单的例子:
我们在开发环境对某个表新增了一个字段,而提交测试时却忘了提交该 SQL 脚本,导致出现 bug 而测试中断,从而影响开发、测试的工作效率。
有了 Flyway
,我们可以按版本约定
,统一管理所有的 SQL 脚本变更,在所有环境自动同步数据库
,而无需人为手工控制,再也不用担心因数据库不同步而导致的各种环境问题
工具 | 版本 |
---|---|
spring boot | 3.1.5 |
flyway | 10.0.1 |
jdk | 17 |
mysql | 8 + |
Flyway 几乎是零依赖
,最低的要求是:
JDK 1.7+
Jdbc Driver
implementation 'org.flywaydb:flyway-core:10.0.1'
<dependency>
<groupId>org.flywaydbgroupId>
<artifactId>flyway-coreartifactId>
<version>10.0.1version>
dependency>
Spring Boot 默认提供了对 Flyway 的自动配置:
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration
spring:
flyway:
enabled: true
# 禁止清理数据库表
clean-disabled: true
# 如果数据库不是空表,需要设置成 true,否则启动报错
baseline-on-migrate: true
# 与 baseline-on-migrate: true 搭配使用
baseline-version: 0
locations:
- classpath:db/migration/mysql #(根据个人情况设置)
将需数据迁移的 sql 文件放置到 db/migration/mysql
目录中,启动 Spring Boot 项目即可运行 Flyway 进行数据迁移。
注意事项:
如果 flyway 不是项目初期引入,而是在数据库已有表的情况下引入时必须设置
baseline-on-migrate: true
,设置该配置启动项目后,flyway 就会在数据库中创建flyway_schema_history
表,并且会往该表中插入一条 version = 1 的建表记录,如果迁移数据有V1__
开头的文件,扫描文件会忽略该文件不执行迁移,进而可能引发其他迁移数据出错的问题。
Flyway不限定脚本里面的内容,但是对脚本文件的名称有一定的要求,基于约定由于配置的原则
,不同的类型通过文件命名方式进行区分
V
开头,只会执行一次;U
开头,执行一旦发生破坏性更改,就会很麻烦,项目中一般不用;可重复执行迁移(Repeatable Migrations)以R
开头,每次修改后都会重新执行。版本号需要唯一,否则Flyway执行会报错;如果
V__脚本.sql
,已经执行过了,不能修改里面的内容,再次执行Flyway就会报错。R——脚本.sql,如有变化可以执行多次。
V开头的SQL执行优先级要比R开头的SQL优先级高。
官方Flyway 8.2.1版本发布说明(https://flywaydb.org/documentation/learnmore/releaseNotes#8.2.1),如下图所示
从说明上可知,MySQL代码被提取出来作为插件,需要另外增加依赖,根据官方文档(https://flywaydb.org/documentation/database/mysql)的说明,解决方案如下:
<dependency>
<groupId>org.flywaydbgroupId>
<artifactId>flyway-mysqlartifactId>
dependency>