Spring Boot 中的 Liquibase – 开发者指南
发布: (2026年3月10日 GMT+8 16:05)
3 分钟阅读
原文: Dev.to
Source: Dev.to
什么是 Liquibase 以及它为何重要
Liquibase 本质上是数据库模式的 Git。与手动运行 SQL 脚本并希望每个人都正确执行不同,你可以用结构化格式定义变更,Liquibase 会跟踪哪些已经被应用。
示例 XML Changeset
Liquibase 在名为 DATABASECHANGELOG 的表中记录已执行的迁移,确保:
- 变更只会被应用一次
- 保持执行顺序
- 可以回滚
关键优势
- 环境一致 – 开发、预发布和生产保持同步
- 迁移历史 – 查看谁在何时做了哪些修改
- 自动迁移 – Spring Boot 可以在启动时自动执行
- 回滚 – 如有需要,可安全撤销变更
在 Spring Boot 中配置 Liquibase
Maven 依赖
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
Gradle 依赖
implementation 'org.liquibase:liquibase-core'
Spring Boot 会自动检测 Liquibase 并运行迁移。
配置 (application.yml)
spring:
liquibase:
change-log: "classpath:/db/changelog/changelog.xml"
contexts: "dev"
典型项目结构
src/main/resources
└─ db
└─ changelog
└─ changelog.xml
编写迁移
完整 XML Changelog 示例 (changelog.xml)
格式化 SQL Changeset 示例
-- liquibase formatted sql
-- changeset dev:create-users
CREATE TABLE users (
id BIGINT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
created_at TIMESTAMP
);
-- changeset dev:add-email-index
CREATE INDEX idx_users_email ON users(email);
-- changeset dev:add-phone-column
ALTER TABLE users ADD COLUMN phone_number VARCHAR(20);
-- rollback: ALTER TABLE users DROP COLUMN phone_number;
最佳实践
- 绝不编辑已执行的迁移 – 迁移是不可变的。
- 一个 changeset = 一个变更 – 保持每个 changeset 专注(例如单表、单列或单索引)。
- 给文件编号,如果使用多个文件,以避免 Git 冲突。
- 本地测试 – 删除数据库,运行应用,确保迁移能够从零开始成功。
- 生产环境要小心 – 在大表上避免使用
ALTER COLUMN TYPE、DROP COLUMN或在未做好规划的情况下添加NOT NULL约束。
功能对比
| 功能 | Liquibase | Flyway |
|---|---|---|
| XML/YAML/JSON | ✔ | ✖ |
| SQL | ✔ | ✔ |
| 回滚 | ✔ | limited |
Flyway 更简洁,但 Liquibase 为企业级部署提供了更大的灵活性。
结论
Liquibase 是保持各环境数据库模式一致的救星。遵循以下黄金法则:
- 不可变的迁移
- 每个 changeset 只做一件事
- 本地测试迁移
感谢阅读!