pom.xml 文件中加入依赖
<!--flyway-->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>5.2.4</version>
</dependency>
application 配置文件
- application.properties 中加入如下配置
# flyway
spring.flyway.baseline-on-migrate=true
spring.flyway.baseline-description=<< Flyway Baseline >>
# 禁止删除 schema 下的 table
spring.flyway.clean-disabled=true
- 如果是用 application.yml 文件,则加入如下配置
spring:
flyway:
baseline-on-migrate: true
baseline-description: << Flyway Baseline >>
clean-disabled: true
创建文件存放目录
- 找到
src -> resources
目录 - 在该目录下创建名为
db
的目录 - 在
db
目录下创建名为 migration
的目录 - 在
migration
目录下创建名为 1.0
的目录,该目录名根据各自项目中的版本号命名, 比如项目版本号为 1.0.0 开始,则可以将目录建为 1.0.0
创建文件
- baseline 文件
- 该文件中的内容只有在空 schema 中才会执行,一般用于老项目后期进行集成 flyway 时,创建初始化 DB 的脚本, 如果是新启动的项目,直接创建一个空文件就可以
- 文件名格式:
V1.0.0__BASELINE_DATABASE.sql
, 注意是在版本目录后面加一位, 该位用于控制文件执行顺序 - 其他文件命名格式:
V1.0.1__DDL(或DML)_{依据项目规范进行该部分的命名,一般是对文件内容的简短描述}.sql
验收
- 启动项目后观察脚本文件执行状态
- 在 DB 中找到
flyway_schema_history
表,该表在集成 flyway 之后,项目第一次启动时会自动创建 - flyway 执行结果
- 执行成功 success 为 1 反之为 0
补充介绍
- flyway 执行失败的文件,在重新启动后会再次执行
- 如果想要手动跳过该文件,可以将 success 改为 1
- 如果定义的脚本已经手动执行过,并且不想再次被自动执行的话,可以在对应的 DB 中对
flyway_schema_history
插入需要跳过的文件执行成功的记录
INSERT INTO `flyway_schema_history` (`installed_rank`, `version`, `description`, `type`, `script`, `checksum`, `installed_by`, `installed_on`, `execution_time`, `success`)
VALUES ('取值为当前表中最后一个id + 1', '1.0.1(需要跳过的文件的前缀)', '<< Flyway Baseline >>', 'BASELINE', '<< Flyway Baseline >>', NULL, 'root', '2020-04-22 09:30:30', '0', '1');
VALUES (''取值为当前表中最后一个id + 1', '1.0.1(需要跳过的文件的前缀,__之前的部分)', ' 将 ‘_’ 替换为 ’ ‘(空格)之后的文件名,__之后的部分', 'SQL', '版本/全文件名', '1272695492(随意)', 'root', '2020-04-22 09:30:47(随意)', '17305(执行时间)', '1(固定为1)');
- 例如我的文件名为
V1.0.1__DDL_CREATE_TABLES.sql
,在 1.0 folder 下 - 则我需要插入的记录为
INSERT INTO `flyway_schema_history` (`installed_rank`, `version`, `description`, `type`, `script`, `checksum`, `installed_by`, `installed_on`, `execution_time`, `success`)
VALUES ('2', '1.0.1', 'DDL CREATE TABLES ', 'SQL', '1.0/V1.0.1__DDL_CREATE_TABLES.sql', '1272695492', 'root', '2020-04-22 09:30:47', '17305', '1');
- 如果在项目启动前就想将对应记录插入, 则可以先创建
flyway_schema_history
表,再插入对应的记录
DROP TABLE IF EXISTS `flyway_schema_history`;
CREATE TABLE `flyway_schema_history` (
`installed_rank` int(11) NOT NULL,
`version` varchar(50) DEFAULT NULL,
`description` varchar(200) NOT NULL,
`type` varchar(20) NOT NULL,
`script` varchar(1000) NOT NULL,
`checksum` int(11) DEFAULT NULL,
`installed_by` varchar(100) NOT NULL,
`installed_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`execution_time` int(11) NOT NULL,
`success` tinyint(1) NOT NULL,
PRIMARY KEY (`installed_rank`),
KEY `flyway_schema_history_s_idx` (`success`)
) ;
- 注意 baseline 的 insert 脚本如下, 永远作为第一条进行 insert
INSERT INTO `flyway_schema_history` (`installed_rank`, `version`, `description`, `type`, `script`, `checksum`, `installed_by`, `installed_on`, `execution_time`, `success`)
VALUES ('1', '1', '<< Flyway Baseline >>', 'BASELINE', '<< Flyway Baseline >>', NULL, 'root', '2020-04-22 09:30:30', '0', '1');