Spring Boot 版本 2.1.17

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.17.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

pom.xml引入flyway的依赖

<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>

application-dev.yml 配置flyway (数据库:local_test_db)

spring:
datasource:
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/local_test_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&allowPublicKeyRetrieval=true&verifyServerCertificate=false&useSSL=false&autoReconnect=true&failOverReadOnly=false
username: root
password: 12345678
flyway:
# 如果启动的时候需要flyway管理sql脚本的话,将enabled设置为true
enabled: true
# 如果数据库不是空表,需要设置成 true,否则启动报错
baseline-on-migrate: true
# 验证错误时 是否自动清除数据库 高危操作!
clean-on-validation-error: false

在resources目录中新建文件夹migration,用于存放sql脚本。

sql 文件所在目录:resources/db/migration (无需配置,Springboot会自动识别migration目录中的文件)

操作一:引入V1.0.1__schema.sql (创建表user)

DROP TABLE IF EXISTS user;

CREATE TABLE IF NOT EXISTS user (
id integer primary key auto_increment,
name VARCHAR(32),
address VARCHAR(64)
)
ENGINE = InnoDB
COMMENT = 'Table User';

以上sql语句执行成功之后,数据库会出现2张表

Spring Boot 使用 flyway_sql

Spring Boot 使用 flyway_spring_02

Spring Boot 使用 flyway_sql_03

操作2:引入V1.0.2__schema.sql (创建表selected_track_index)

Spring Boot 使用 flyway_flyway_04

-- Table selected_track_index
DROP TABLE IF EXISTS selected_track_index;

CREATE TABLE IF NOT EXISTS selected_track_index (
id INTEGER PRIMARY KEY AUTO_INCREMENT,
key_name VARCHAR(64),
key_value VARCHAR(64)
) ENGINE=INNODB COMMENT='Selected Tracks.';

运行Springboot Application,成功之后,刷新Tables会出现3张表,包括新建的表"selected_track_index"。

操作3:引入V1.0.3__insert_data.sql (user表中插入1条数据)

3.1 插入出错

INSERT INTO `user` (`id`, `name`, `address`) VALUES
(1 'Bill', 'Shanghai'); # 1后面少量逗号,sql语句错误。

插入sql语句有语法错误,V1.0.3__insert_data.sql执行失败。但是数据库中的表flyway_schema_history依旧发生变化。

Spring Boot 使用 flyway_spring boot_05

success 的值为0,表示执行失败。此时,更新V1.0.3__insert_data.sql,纠正sql语句。

INSERT INTO `user` (`id`, `name`, `address`) VALUES
(1, 'Bill', 'Shanghai');

虽然sql语句被纠正了,但是运行SpringBoot Application时还是会报错。

备注:`` 是有必要的,否则会报错。(flyway执行以下sql语句时会报错

INSERT INTO user (id, name, address) VALUES
(1, 'Bill', 'Shanghai');

3.1 插入正确

问题解决步骤:

1. 删除flyway_schema_history中第3条错误记录。

delete  FROM flyway_schema_history WHERE installed_rank = 3;

Spring Boot 使用 flyway_flyway_06

2. 运行Springboot项目,V1.0.3__insert_data.sql被成功执行。

Spring Boot 使用 flyway_sql_07

success 的值为1,表示执行成功。user表成功插入数据

Spring Boot 使用 flyway_sql语句_08

小总结:运行错误时,删除flyway_schema_history 中的错误记录,重新运行项目即可。

参考

1. ​​flyway使用简介​

2. ​​Flyway详解以及Springboot集成Flyway(转)​