项目背景
1、spring cloud,maven多模块项目,使用mysql数据库
需求
1、想实现数据库版本控制,特别是首次上线时候可以自动初始化数据库
具体操作
1、添加依赖
在pom文件中引入flyway-core依赖,版本根据自己需要定义,我这里是直接拿的父pom中的。
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
2、配置
然后在application.xml中添加如下配置,
spring:
flyway:
# 是否启用flyway
enabled: true
#禁用clean操作,禁止清理数据库表,生产环境上必须关闭flyway:clean指令,因为一旦误操作,所有数据将会被清空;
clean-disabled: true
# 迁移sql脚本文件存放路径,默认db/migration
locations: classpath:db/migration
# 检测迁移脚本的路径是否存在,如不存在,则抛出异常
check-location: true
# 编码格式,默认UTF-8
encoding: UTF-8
# 迁移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
#初始化设置版本
baseline-version: 1.0.0.1
#初始化设置描述
baseline-description: init
#是否允许无序的迁移,默认false,生产环境需要设置为false
out-of-order: true
上面是dev环境的配置,因为我数据库已经存在,且不需要做sql脚本变动,所以设定初始化版本。生产环境把最后三个配置注释掉,使用默认配置。
再在Resources/db/migration目录下添加你的sql脚本,形如:V1.0.1__init.sql。
数据库脚本文件命名有约定的规则:
常用格式如下:
PREFIXPREFIXPREFIXVERSION__REMARK.REMARK.REMARK.SUBFIX
$prefix 表示 前缀,可在配置中指定,默认为 V;
$version 表示 版本号,版本号中也可以使用 . 或 _分隔,在解析时会将 _ 转换为 . 再保存到flyway_schema_history表的version字段中;
$remark 表示 备注,解析后会将这部分写入到描述字段中;
$subfix 表示 后缀,可在配置中指定,默认为 .sql ;
版本号与备注之前使用__分隔;
结果
程序启动后会在数据库生成一张表flyway_schema_history,
dev环境的配置只会有一条记录,version和script字段就是配置的值;
下图是生成环境的时候,会产生两条记录,第二条是执行初始化脚本的记录。