Flyway 学习使用总结
前言
之前从未认为数据库管理是这么的重要,直到去年参与核算检测的项目,迭代周期极其之短,加之开发、测试、预发、生产多套环境并存,之前通过markdown记录的数据库变动心力交瘁,才真正着手了解flyway,现将核心且常见的基础理论部分记录于此。
以上
共勉
baidonghui 2021/05
自研软件推广位,欢迎扫码体验
Flyway 可以通过 sql 语句对数据库进行版本控制,在CI/CD中也能很好的解决数据库升版和迁移问题。
一、工作流程
Flyway 的工作主要依赖于一张历史记录表及一组记录数据库变动的sql脚本文件。
首先 Flyway 会在数据库中维护一张历史记录表(若为空库默认自动创建,默认表名为 flyway_schema_history
),用于跟踪记录数据库的版本。其中包括版本号、脚本名称、脚本校验值、执行顺序号、执行时间、是否成功等。
随后 Flyway 会扫描指定路径下记录数据库变更的 sql 文件,与数据库中记录的版本进行比对。
低于数据库当前版本的脚本会被忽略,高于数据库当前版本的脚本,会依次按照版本号升序执行,对数据库进行打版升级。
二、使用 Flyway
1. 引入
在 Spring Boot 中,引入方式非常简单。
-
可以在新建 Spring Boot 项目时,勾选
Flyway Migration
。此时会自动引入 Flyway 依赖,并创建存放sql文件的目录/resources/db/migration
。 -
现有的 Spring Boot 项目,则需手动增加Flyway依赖,并创建存放sql文件的目录,默认目录仍为
/resources/db/migration
。
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
2. 创建 Sql 脚本文件
Flyway支持的脚本文件分为两类,版本变更脚本文件和可重复执行文件,两种文件都应按照规则进行命名,并放入对应的sql文件目录里。
版本变更文件命名方式为V版本号__描述.sql
,例如:
版本号1的脚本文件:V1__Initial_Setup.sql
版本号2的脚本文件:V2__First_Changes.sql
版本号2.1的脚本文件:V2_1__Refactoring
可重复执行文件命名方式为R__描述.sql
,例如:R__add_unknown_user.sql
。
注意:Flyway会对脚本文件进行校验。以V开头的版本变动文件,不应该进行修改。R开头的脚本文件,若发生变动后,将会再次执行。
3. 启动项目
运行 Spring Boot 项目,可在启动日志里找到类似如下的数据库版本日志。
2021-05-06 14:51:56.465 INFO 6236 --- [ main] o.f.c.i.database.base.DatabaseType : Database: jdbc:mysql://localhost:3306/transcar (MySQL 5.7)
2021-05-06 14:51:56.511 INFO 6236 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 1 migration (execution time 00:00.025s)
2021-05-06 14:51:56.530 INFO 6236 --- [ main] o.f.c.i.s.JdbcTableSchemaHistory : Creating Schema History table `transcar`.`flyway_schema_history` with baseline ...
2021-05-06 14:51:56.624 INFO 6236 --- [ main] o.f.core.internal.command.DbBaseline : Successfully baselined schema with version: 20210506143332
2021-05-06 14:51:56.645 INFO 6236 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema `transcar`: 20210506143332
2021-05-06 14:51:56.646 INFO 6236 --- [ main] o.f.core.internal.command.DbMigrate : Schema `transcar` is up to date. No migration necessary.
三、常见配置项
spring.flyway.enabled
:默认true
为开启状态。
spring.flyway.baseline-description
:设置在进行基线版本打版时的描述信息。
spring.flyway.baseline-on-migrate
:设置在非空库中,是否进行基线打版,默认值为false
。因此按照上面的工作流程,若数据库为非空库,则不会自动创建数据库版本记录表。
spring.flyway.baseline-version
:默认值为1
,指定基线版本的版本号。对应SQL变更文件名V后的版本号。
spring.flyway.locations
:默认值[classpath:db/migration]
,指定sql文件的目录。
完整配置项参见Spring官方文档