Springboot集成Flyway
Flyway 简介
Flyway 是一款开源的数据库版本管理工具,Flyway 可以独立于应用实现管理并跟踪数据库变更,支持数据库版本自动升级,并且有一套默认的规约,不需要复杂的配置,Migrations 可以写成 SQL 脚本,也可以写在 Java 代码中,不仅支持 Command Line 和 Java API,还支持 Build 构建工具和 Spring Boot等,同时在分布式环境下能够安全可靠地升级数据库,同时也支持失败恢复等。
Flyway基本命令:迁移,清理,信息,验证,撤消,基线和修复。
导入maven依赖
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
<exclusions>
<exclusion>
<artifactId>protobuf-java</artifactId>
<groupId>com.google.protobuf</groupId>
</exclusion>
</exclusions>
</dependency>
spring-boot-starter-data-jpa,mybatis-spring-boot-starter 可以选择其中一个导入,因为Flyway用到其中的数据库注解。
数据库和Flyway配置
Flyway默认可以不用配置,可以选择性的配置。
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
username: root
password: root
url: jdbc:mysql://localhost:3306/vhr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
flyway:
#如果启动的时候需要flyway管理sql脚本的话,将enabled设置为true
enabled: true
#如果数据库不是空表,需要设置成true,否则启动报错
baselineOnMigrate: true
#验证错误时 是否自动清除数据库 高危操作
clean-on-validation-error: false
添加基础数据库sql
在resource,db.migration文件中新建V1__vhr.sql。
数据库脚本的命名方式如下:
V__.sql
首先是大写字母 V,然后是版本号,要是有小版本可以用下划线隔开,例如 2_1,版本号后面是两个下划线,然后是脚本名称,文件后缀是 .sql。
DROP TABLE IF EXISTS `adjustsalary`;
CREATE TABLE `adjustsalary` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`eid` int(11) DEFAULT NULL,
`asDate` date DEFAULT NULL COMMENT '调薪日期',
`beforeSalary` int(11) DEFAULT NULL COMMENT '调前薪资',
`afterSalary` int(11) DEFAULT NULL COMMENT '调后薪资',
`reason` varchar(255) DEFAULT NULL COMMENT '调薪原因',
`remark` varchar(255) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `pid` (`eid`),
CONSTRAINT `adjustsalary_ibfk_1` FOREIGN KEY (`eid`) REFERENCES `employee` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
注意:数据库sql名称的下划线为两个下划线。
启动项目后,我们可以看到Flyway的执行信息,数据库脚本同时也执行了,且Flyway还创建了一个flyway_schema_history表,这个表用来记录数据库的更新历史。
有了这条记录,下次再启动项目,V1__vhr.sql这个脚本文件就不会执行了,因为系统知道这个脚本已经执行过了,如果你还想让V1__vhr.sql脚本再执行一遍,需要手动删除flyway_schema_history表中的对应记录,项目重新启动时,这个脚本就会被执行了。
flyway其他配置
spring.flyway.encoding:flyway 字符编码
spring.flyway.locations:sql 脚本的目录,默认是 classpath:db/migration,如果有多个,用 , 隔开
spring.flyway.clean-disabled:这个属性非常关键,它表示是否要清除已有库下的表,如果执行的脚本是 V1__xxx.sql,那么会先清除已有库下的表,然后再执行脚本,这在开发环境下还挺方便,但是在生产环境下就要命了,而且它默认就是要清除,生产环境一定要自己配置设置为 true
spring.flyway.table:配置数据库信息表的名称,默认是 flyway_schema_history
flyway.baseline-description对执行迁移时基准版本的描述.
flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
flyway.check-location检查迁移脚本的位置是否存在,默认false.
flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.
flyway.enabled是否开启flywary,默认true.
flyway.encoding设置迁移时的编码,默认UTF-8.
flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.
flyway.init-sqls当初始化好连接时要执行的SQL.
flyway.locations迁移脚本的位置,默认db/migration.
flyway.out-of-order是否允许无序的迁移,默认false.
flyway.password目标数据库的密码.
flyway.placeholder-prefix设置每个placeholder的前缀,默认${.
flyway.placeholder-replacementplaceholders是否要被替换,默认true.
flyway.placeholder-suffix设置每个placeholder的后缀,默认}.
flyway.placeholders.[placeholder name]设置placeholder的value
flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
flyway.sql-migration-prefix迁移文件的前缀,默认为V.
flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__
flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql
flyway.tableflyway使用的元数据表名,默认为schema_version
flyway.target迁移时使用的目标版本,默认为latest version
flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
flyway.user迁移数据库的用户名
flyway.validate-on-migrate迁移时是否校验,默认为true.
参考下面:
https://www.jianshu.com/p/779c2b4c053c?utm_campaign=haruki
https://baijiahao.baidu.com/s?id=1659024978275677262&wfr=spider&for=pc
https://flywaydb.org/documentation/