Flyway配置
你好呀,我的老朋友!我是老寇,欢迎来到老寇IoT云平台!
# 什么是 Flyway?
Flyway 是一个开源的数据库迁移工具,它秉承“约定优于配置”的理念,让数据库变更的过程像代码版本控制一样简单且可追溯。
# Spring Boot 集成 Flyway
在 Spring Boot 项目中集成 Flyway 步骤如下:
- 引入依赖
在
pom.xml中引入相关的依赖:
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-database-postgresql</artifactId> <!-- 若为 PostgreSQL 需要此包 -->
</dependency>
- 配置 application.yml 配置 Flyway 的基础参数:
spring:
flyway:
enabled: true
# SQL脚本存放路径,默认是 classpath:db/migration
locations: classpath:db/migration
# 第一次运行环境是否自动执行基准迁移(当已有数据库表时需开启)
baseline-on-migrate: true
# 基准版本号,默认为 1
baseline-version: 1
# 历史记录表名,默认 flyway_schema_history
table: flyway_schema_history
- 编写 SQL 脚本
在 src/main/resources/db/migration 目录下按照约定命名并存放你的 SQL 脚本:
命名规范:V{版本号}_{yyyyMMddHHmm}__{operate}_{table}.sql
注意事项:执行过的SQL脚本不能修改,如果需要修改字段类型,添加字段等,参考alter
操作类型(operate):
- create(创建表)
- insert(插入数据)
- update(修改数据)
- delete(删除数据)
- alter(新增或修改表字段类型/注释/名称)
- idx(新增索引)
例如:V1_202304011000__create_user.sql、V2_202304011001__insert_user.sql
项目启动时,Spring Boot 会自动执行未被记录的脚本,并将其状态写入并维护在 flyway_schema_history 表中。
# Flyway 与 Liquibase 的对比区别
Flyway 和 Liquibase 都是目前主流且优秀的数据库版本控制工具,但也存在明显的差异:
| 特性维度 | Flyway | Liquibase |
|---|---|---|
| 编写格式 | 主要是纯 SQL 文件(也支持 Java API) | 主要通过 XML、YAML、JSON 描述(也支持 SQL) |
| 学习曲线 | 平缓/极低:掌握 SQL 即可上手,简单直观。 | 陡峭/较高:需学习特有的标签和语法节点。 |
| 跨数据库兼容 | 较弱:因为直接写原生 SQL,换数据库时往往需重写或维护多套 SQL 脚本。 | 极强:只需写一套 XML/YAML,工具会自动翻译为目标数据库的方言。 |
| 功能丰富度 | 轻量级,功能简单,专注于直接执行变更。 | 重量级,提供复杂的 Preconditions(前置条件)、上下文(Contexts)控制等功能。 |
| 回滚能力(Undo) | 社区免费版不支持回滚功能(仅商业版支持)。 | 免费开源版原生支持很好的回滚(Rollback)操作。 |
| 最佳适用场景 | 数据库选型固定(例如只用 MySQL),团队喜欢原生 SQL 所见即所得。 | 需同时兼容 MySQL/PG/Oracle 等多类型数据库的产品,或强依赖回滚管理的企业级应用。 |
优势与劣势
| 维度 | Flyway | Liquibase |
|---|---|---|
| 学习成本 | 低 | 高 |
| 简单性 | 非常简单 | 复杂 |
| SQL支持 | 原生 | 需要 DSL |
| rollback | 弱 | 强 |
| 多数据库支持 | 弱 | 强 |
| schema diff | 无 | 有 |
| CI/CD | 非常友好 | 一般 |
| 微服务 | 非常适合 | 一般 |
我是老寇,我们下次再见啦!
上次更新: 3/11/2026, 12:21:59 PM