github地址
https://github.com/yanjingfan/sakura-boot-demo/tree/master/web
flyway
用途:初始化数据库,支持数据库脚本的版本管理
第一步:springboot已经集成了flyway,加入依赖时并不需要添加版本号
<!-- 添加 flyway 的依赖开始 -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<!-- flyway使用jdbc依赖包初始化数据库 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 添加 flyway 的依赖结束 -->
<!-- MySql数据库连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
第二步:在
classpath:db/migration
目录下创建数据库脚本
举例:V1_0_0__init_20210702.sql
#下面的是例子中的表
CREATE TABLE IF NOT EXISTS `t_order`(
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
edit_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
order_id VARCHAR(64) NOT NULL COMMENT '订单ID',
amount DECIMAL(12, 2) NOT NULL DEFAULT 0 COMMENT '订单金额',
INDEX idx_user_id (user_id),
UNIQUE uniq_order_id (order_id)
) COMMENT '订单表';
-
Flyway 执行的 SQL 脚本必须遵循一种命名规则,
V<VERSION>__<NAME>.sql
首先是
V
,然后是版本号,如果版本号有多个数字,使用
_
分隔,比如
1_0_0
版本号的后面是 2 个下划线,最后是 SQL 脚本的名称。
这里需要注意:
-
V 开头的只会执行一次,下次项目启动不会执行,也不可以修改原始文件,否则项目启动会报错,如果需要对 V 开头的脚本做修改,如果有个 SQL 脚本需要在每次启动的时候都执行,那么将 V 改为
R
开头即可
-
使用flyway创建表后,就不要再去数据库手动改这张表的结构了,一切表的结构改动都用flyway,否则会影响修改记录,导致项目报错
-
上述两种情况的解决方案:
找到
flyway_schema_history
表,删除对应的记录即可
-
第三步:
yml配置
spring:
flyway:
enabled: true
# 迁移前校验 SQL 文件是否存在问题
validate-on-migrate: true
# 一定要设置为true,否则会清空数据库
clean-disabled: true
# 校验路径下是否存在 SQL 文件
check-location: false
# 最开始已经存在表结构,且不存在 flyway_schema_history 表时,需要设置为 true
baseline-on-migrate: true
# 基础版本 0
baseline-version: 0
properties配置
################################ flyway ############################
spring.flyway.enabled=true
# 迁移前校验 SQL 文件是否存在问题
spring.flyway.validate-on-migrate=true
# 生产环境一定要关闭
spring.flyway.clean-disabled=true
# 校验路径下是否存在 SQL 文件
spring.flyway.check-location=false
# 最开始已经存在表结构,且不存在 flyway_schema_history 表时,需要设置为 true
spring.flyway.baseline-on-migrate=true
# 基础版本 0
spring.flyway.baseline-version=0
升级脚本越来越多怎么办
当经历几十个版本之后,”src/main/resources/db/migration”下面脚本越来越多,带来两个问题:
- 脚本太多,难以维护;
- 通过SQL脚本无法直观地看出最新的表结构。
经验和建议:
- 关闭Flyway的脚本文件校验和检查,即设置validateOnMigrate=false;
- 定期合并历史脚本,比如将V1.0.1,V1.0.2,V1.0.3的脚本都合并到V1.0中,并删除前三个文件。
脚本合并非Flyway才需要的技能,我有一些技巧让SQL更简洁:
- 将ALTER语句合并到CREATE语句中;
- DROP与CTEATE+ALTER抵消;
- UPDATE视情况合并到INSERT语句中(基础数据升级),或者直接去掉(业务数据升级)。