springboot2.x集成Flyway

Flyway 是一个开源的数据库迁移工具,专为管理数据库结构变更而设计,广泛应用于 Java 生态系统中,尤其与 Spring Boot、Maven、Gradle 等框架深度集成。

✅ 核心功能

  • 版本化迁移 ‌:通过命名规范的 SQL 脚本(如 V1__Create_user_table.sql)或 Java 类(实现 JdbcMigration)记录数据库变更。
  • 自动执行‌:应用启动时自动检测并按版本顺序执行未应用的迁移脚本,确保数据库始终与代码版本一致。
  • 校验与修复 ‌:支持校验脚本完整性,防止被篡改;提供 repair 命令修复损坏的元数据表。
  • 多数据库支持‌:兼容 MySQL、PostgreSQL、Oracle、SQL Server、H2 等主流关系型数据库。

📂 迁移脚本命名规范

表格

类型 命名格式 说明
SQL 迁移 V<版本>__<描述>.sql V1__create_table.sql
可重复迁移 R__<描述>.sql 每次启动都会重新执行,用于视图、函数等
Java 迁移 实现 JdbcMigration 接口 适用于复杂逻辑,如数据迁移、条件判断

🔄 工作流程

  1. 应用启动时,Flyway 检查数据库中的 flyway_schema_history 表。
  2. 对比该表记录与项目中所有迁移脚本的版本。
  3. 按版本号升序执行缺失的迁移脚本。
  4. 更新元数据表,记录执行时间、状态、校验和等信息。

💡 典型应用场景

  • CI/CD 流水线‌:确保测试、预发、生产环境数据库结构完全一致。
  • 团队协作‌:避免开发人员手动执行 DDL 导致的环境差异。
  • 微服务架构‌:每个服务独立管理自己的数据库迁移,解耦性强。

🛠️ 配置示例(Spring Boot)

复制代码
		<!-- flywaydb数据库维护,迁移工具 -->
		<dependency>
		    <groupId>org.flywaydb</groupId>
		    <artifactId>flyway-core</artifactId>
		</dependency>

✅ 优势对比(vs. 手动脚本)

表格

特性 Flyway 手动执行
自动化 ✅ 是 ❌ 否
版本控制 ✅ 是 ❌ 否
回滚支持 ⚠️ 有限(需手动) ✅ 可自定义
多环境支持 ✅ 是 ⚠️ 易出错
集成度 ✅ 深度集成 Java 生态 ❌ 无

⚠️ 当前存在的问题

  • 不支持原生回滚‌:需手动编写回滚脚本或依赖第三方工具(如 Liquibase)。
  • 脚本耦合性强‌:迁移脚本与业务逻辑绑定,修改历史脚本可能导致部署失败。
  • 复杂事务处理困难‌:跨多个数据库或分布式事务场景下需额外设计。

Flyway 通过标准化、自动化的方式,显著降低了数据库变更的风险与运维成本,是现代 Java 应用不可或缺的 DevOps 工具之一。

springboot2.x集成Flyway

如果数据库表为空:

1.引入

复制代码
		<!-- flywaydb数据库维护,迁移工具 -->
		<dependency>
		    <groupId>org.flywaydb</groupId>
		    <artifactId>flyway-core</artifactId>
		</dependency>

2.在你的项目中创建以下目录和文件:

复制代码
src/main/resources/
 └── db/ 
        └── migration/ 
                └── V1__init_schema.sql

3.写入创建表或者初始数据的sql

注:

如果有表数据,引入Flyway 是为了修改数据信息或者新增表结构

✅ 方式一:‌**推荐!使用 baselineOnMigrate=true(最安全的生产兼容方案)**‌

如果你的数据库中已有表结构,且这些表是你希望 Flyway ‌**接管并视为"版本 1"**‌ 的起点,最推荐的做法是:

application.yml 中:

复制代码
spring: 
    flyway:
        baseline-on-migrate: true
        baseline-version: 1

将V1__add_index.sql改为V2__add_index.sql

✅ ‌作用 ‌:Flyway 会自动创建 flyway_schema_history 表,并将当前数据库状态标记为版本 1,之后所有新的迁移脚本(如 V2__add_index.sql)将从版本 2 开始正常执行。

💡 ‌这是生产环境最常用、最安全的方案‌,无需删除数据,无需手动干预数据库。

相关推荐
disgare2 小时前
关于 spring 工程中添加 traceID 实践
java·后端·spring
李白的粉2 小时前
基于springboot+vue的旅游民宿管理系统
java·spring boot·vue·毕业设计·课程设计·源代码·旅游民宿管理系统
摇滚侠2 小时前
搭建前端开发环境 安装 nodejs 设置淘宝镜像 最简化最标准版本 不使用 NVM NVM 高版本无法安装低版本 nodejs
java·开发语言·node.js
花千树-0102 小时前
兼容 ThreadLocal 的用户上下文透传方案:WebFlux 项目改造实践
java·spring boot·servlet·jetty
无人机9014 小时前
Delphi 网络编程实战:TIdTCPClient 与 TIdTCPServer 类深度解析
java·开发语言·前端
TeDi TIVE4 小时前
Spring Cloud Gateway
java
:mnong5 小时前
Superpowers 项目设计分析
java·c语言·c++·python·c#·php·skills
扶苏-su6 小时前
Java--获取 Class 类对象
java·开发语言
东离与糖宝6 小时前
LangChain4j vs Spring AI:最新对比,Java企业级Agent开发
java·人工智能