Spring Boot 使用 flyway

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张表

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

-- 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依旧发生变化。

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;

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

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

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

参考

1. flyway使用简介

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

猜你喜欢

转载自blog.csdn.net/A_bad_horse/article/details/113772268