Spring Boot中使用Flyway进行数据库迁移

文章目录

概要

在 Spring Boot 项目开发中,数据库的变更不可避免。手动执行 SQL 脚本不仅容易出错,也难以维护数据库版本的一致性。Flyway 作为一款轻量级的数据库迁移工具,能够帮助我们优雅地解决这些问题。

Spring Boot 集成 Flyway

1、添加 Flyway 依赖

xml 复制代码
 <dependency>
     <groupId>org.flywaydb</groupId>
     <artifactId>flyway-core</artifactId>
     <version>6.1.0</version>
 </dependency>

2、配置 Flyway

yaml 复制代码
spring:
  flyway:
    enabled: true
    locations: classpath:db/migration
    baseline-on-migrate: true
    placeholder-replacement: false
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/my_info?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL=false
    username: root
    password: iuowiebd

3、创建数据库迁移脚本

Flyway 使用 SQL 脚本来定义数据库的变更。脚本需要放在 src/main/resources/db/migration 目录下(默认路径),并且遵循特定的命名规则:V<版本号>__<描述>.sql

例如:V1__create_user_table.sql

sql 复制代码
CREATE TABLE user
(
    id    INT PRIMARY KEY AUTO_INCREMENT,
    name  VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL
);

insert into user (name, email)
values ('user1', 'user1@qq.com');

4、启动应用

启动 Spring Boot 应用,Flyway 会自动执行 db/migration 目录下的迁移脚本,并将执行记录存储在 flyway_schema_history 表中。

控制台关于 flyway 的日志信息:

成功创建表:

Flyway 其他用法

1、 禁用 Flyway 自动迁移

在某些场景下,可能需要手动控制 Flyway 的迁移,可以禁用自动迁移:

yaml 复制代码
spring:
  flyway:
    enabled: false

bug错误

Flyway版本不兼容

如果使用的 Flyway 版本与 Spring Boot 版本不兼容,可能会导致 Flyway 无法正常工作。

控制台不打印任何关于 flyway 的日志。

数据库存在表了

数据库存在表了,就不会执行 sql 了。

Flyway 只会执行比当前数据库版本号更高的迁移脚本。如果数据库的当前版本是 1,而你的迁移脚本的版本号也是 1 或者更低,Flyway 会认为这些脚本已经执行过,因此不会再次执行。

所以只需把 sql 脚本的版本改一下,V2__create_user_table.sql(升高版本)

Flyway 的校验和(Checksum)不匹配

我先启动项目,数据库迁移成功,然后我改动了sql文件,就报错:

如果本地迁移脚本的内容发生了更改(例如,修改了 SQL 脚本),Flyway 会检测到校验和不匹配,从而抛出此错误。

相关推荐
你住过的屋檐几秒前
【oracle】oracle数据处理将一行数据根据条件拆分为多行
数据库·oracle
踏浪无痕2 分钟前
为什么 Spring Cloud Gateway 必须用 WebFlux?
后端·面试·架构
椰汁菠萝14 分钟前
spring boot整合flowable(分库)
spring boot·flowable·分库
Channing Lewis16 分钟前
数据库的dump备份
数据库
码匠君22 分钟前
Dante Cloud 升级 Spring Boot 4 经验分享
经验分享·spring boot·后端
开开心心_Every25 分钟前
无广告干扰:简单好用文字LOGO设计工具
xml·java·网络·数据库·华为od·华为云·excel
秋邱27 分钟前
Java面向对象进阶:封装、继承、多态的实现逻辑与实战案例
java·开发语言·后端·spring cloud·ar·restful
悄悄敲敲敲29 分钟前
数据库:库的操作
数据库
JAVA学习通34 分钟前
数据库备份与恢复(2)
数据库
lhrimperial36 分钟前
MongoDB核心技术深度解析题
数据库·mongodb