文章时效性提示

这是一篇发布于 79 天前的文章,部分内容可能已过时。

flyway版本控制

SpringBoot项目通过flyway对sqlite进行版本控制,以及flyway原理

Spring Boot 使用 Flyway 管理 SQLite 数据库版本

为什么要使用 Flyway?

解决的问题:

  • 客户端开发,修改数据库等操作重复执行问题
  • 数据库版本混乱:团队开发中多人修改数据库结构导致版本不一致
  • 手动维护困难:人工记录和执行 SQL 脚本易出错
  • 环境差异:开发、测试、生产环境的数据库结构不同步
  • 回滚困难:缺乏结构化的版本回退机制

使用 Flyway 可以很方便的处理数据库表结果、数据的版本迁移,使用简单、自动化,大大提高生产力,再也不需要手工在控制台进行,那样更容易出错或者遗漏,毕竟人都是会经常犯错的。

Flyway 工作原理

核心机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                       +-------------------+
| SQL 迁移脚本 |
| (V1__Create.sql) |
+---------+---------+
|
v
+----------------+ +-----------------+ +-----------------+
| 应用启动时 | | Flyway 核心引擎 | | 数据库元数据表 |
| 检查迁移脚本版本 +------->| 对比版本差异 +------->| (flyway_schema_history) |
+----------------+ +--------+--------+ +-----------------+
|
v
+-----------------+
| 执行未应用的迁移 |
+-----------------+
TEXT

核心概念

迁移脚本:命名规则 V{版本号}__{描述}.sql(如 V1__Create_user_table.sql)

元数据表:flyway_schema_history(记录迁移历史、校验和、执行时间)

校验和:对 SQL 文件内容计算哈希值,防止意外修改

版本顺序:严格按版本号顺序执行迁移(不支持版本跳跃)

使用方法(Spring Boot + SQLite)

添加依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- pom.xml -->
<dependencies>
<!-- SQLite 驱动 -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.42.0.0</version>
</dependency>

<!-- Flyway -->
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>9.22.3</version>
</dependency>
</dependencies>
XML

配置 Flyway

1
2
3
4
5
6
7
8
9
10
11
12
13

spring:
datasource:
url: jdbc:sqlite:/path/to/your/database.db
driver-class-name: org.sqlite.JDBC

# Flyway 配置
flyway:
enabled: true
locations: classpath:db/migration # 迁移脚本存放位置
baseline-on-migrate: true # 首次迁移时自动创建元数据表
sql-migration-suffixes: .sql # 识别 SQL 文件后缀

YAML

创建迁移脚本

1
2
3
4
5
src/main/resources/
└── db/
└── migration/
├── V1__Create_user_table.sql
└── V2__Add_email_column.sql
TEXT

操作注意事项

开发阶段

  • 脚本命名:必须使用双下划线 __(单下划线会导致识别失败)

  • 脚本修改:已执行的脚本禁止修改内容(校验和会变化导致失败)

  • 测试验证:执行 mvn flyway:info 查看迁移状态

生产环境

  • 备份先行:执行迁移前必须备份数据库

  • 禁用 clean:禁止配置 flyway.clean-on-validation-error=true

  • 版本顺序:必须按版本号顺序执行(不可跳过中间版本)

SQLite 特殊限制

  • 不支持 DDL 事务:CREATE TABLE / ALTER TABLE 无法回滚

  • 列修改限制:需通过新建表迁移数据实现 ALTER TABLE

  • 并发控制:SQLite 写操作串行化,避免多服务同时迁移

常用命令

命令 作用
mvn flyway:migrate 执行所有未应用的迁移
mvn flyway:info 查看当前迁移状态
mvn flyway:validate 验证迁移脚本是否可应用
mvn flyway:repair 修复元数据表(校验和错误时使用)

flyway版本控制
https://zhyyao.me/2025/01/16/experience/spring_flyway_helper/
作者
zhyyao
发布于
2025年1月16日
许可协议