在项目中做好脚本自动化管理,是每个开发者都应该考虑的第一件事情,为后续数据模型的变更做好迭代管控,使得修改表模型不再成为头疼的一件事。
以下从接入步骤和使用技巧两方面带大家快速认识一下flyway
接入步骤
- 在pom.xml中引入flyway
<properties>
<flyway.version>5.2.4</flyway.version>
</properties>
<!-- 数据库脚本管理 -->
<dependencies>
<!-- other pom -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>${flyway.version}</version>
</dependency>
</dependencies>
- 在application.yml中增加配置信息
spring:
flyway:
# flyway 的 clean 命令会删除指定 schema 下的所有 table, 应该禁掉
clean-disabled: true
# 启用 flyway
enabled: true
#设定 SQL 脚本的目录,多个路径使用逗号分隔
locations: classpath:META-INF/migrations
# 初始化schema_version表
baseline-on-migrate: true
#设定 flyway 的 metadata 表名, 缺省为 flyway_schema_history
table: security_flyway_schema_history
#多人协作开发, 很可能先 apply 了自己本地的最新 SQL 代码, 然后发现其他同事早先时候提交的 SQL 代码还没有 apply,
#所以 开发环境应该设置 spring.flyway.outOfOrder=true, 这样 flyway 将能加载漏掉的老版本 SQL 文件;
#生产环境建议为 spring.flyway.outOfOrder=false
out-of-order: false
#需要 flyway 管控的 schema list, 缺省的话, 使用的时 dbsource.connection直连上的那个 schema,
#可以指定多个schema, 但仅会在第一个schema下建立 metadata 表, 也仅在第一个schema应用migration sql 脚本.
#但flyway Clean 命令会依次在这些schema下都执行一遍
#schemas: {database.schema}
encoding: UTF-8
-
在yml文件locations配置的目录中增加自己的sql脚本(目录自己手动创建即可)
注意脚本命名,‘__’前半部分是版本号,建议用格式化时间;后半部分是脚本名称 - 项目启动时会自动执行没有执行过的sql脚本,看日志和flyway的脚本表即可。
2020-07-14 16:04:48.731 - INFO o.f.c.i.license.VersionPrinter : Flyway Community Edition 5.2.4 by Boxfuse
2020-07-14 16:04:48.733 - INFO o.f.c.i.database.DatabaseFactory : Database: jdbc:mysql://192.168.100.214:3360/dten_security (MySQL 5.7)
2020-07-14 16:04:48.806 - INFO o.f.core.internal.command.DbValidate : Successfully validated 12 migrations (execution time 00:00.040s)
2020-07-14 16:04:48.820 - INFO o.f.core.internal.command.DbMigrate : Current version of schema `dten_security`: 1.20200713.04
2020-07-14 16:04:48.822 - INFO o.f.core.internal.command.DbMigrate : Migrating schema `dten_security` to version 1.20200714.01 - INIT RIGHT TABLE
2020-07-14 16:04:48.845 - INFO o.f.core.internal.command.DbMigrate : Successfully applied 1 migration to schema `dten_security` (execution time 00:00.033s)
flyway日志表:security_flyway_schema_history
使用技巧
- sql命名时版本号部分以时间戳命名,精确到天,如果当天多个脚本,再加个自增序号
- sql脚本名称部分,建议一张表变动为一个文件,按单一职责原则,后续有变动好维护;ddl和dml也建议分开,命名时能望名知义,了解当前脚本能做什么操作
如:
V1_20200624_01__INIT_DATABASE.sql
V1_20200628_01__INIT_APP_TABLE.sql
V1_20200628_02__INIT_RIGHT_TABLE.sql
V1_20200710_01__INIT_ORG_TABLE.sql
V1_20200710_02__ADD_USER_TABLE.sql
V1_20200710_03__INIT_USER_TABLE.sql
V1_20200713_01__ADD_SEQUENCE_TABLE.sql
V1_20200713_02__ADD_SEQ_FUNC.sql
V1_20200713_03__ALTER_USER_TABLE.sql
V1_20200713_04__ALTER_APP_TABLE.sql
V1_20200714_01__INIT_RIGHT_TABLE.sql
- 如果执行后想变动脚本,再次启动应用会报错,这种情况下,删除flyway日志表中相应记录,重启应用即可。
联系作者:do_believe@163.com