Flyway和Liquibase均通过版本化、自动化、可追溯机制实现数据库变更与代码同步;Flyway以SQL脚本+命名约定为主,轻量可控;Liquibase以声明式changeSet+多格式DSL为核,支持跨库抽象与内置回滚。

在 Spring Boot 中用 Flyway 或 Liquibase 管理数据库版本,核心是把数据库变更当作代码来版本化、可追溯、自动执行。两者都能解决“开发环境建了表,测试环境漏了字段,生产环境结构不一致”这类问题,但设计思路和使用习惯有明显差异。
Flyway:约定优先,SQL 主导,简单直接
Flyway 强调“脚本即版本”,默认只认 SQL(也支持 Java 迁移),靠文件名规范控制顺序和类型:
-
命名必须严格:版本迁移脚本以
V{版本号}__{描述}.sql格式命名,例如V1__create_user_table.sql、V1.1__add_email_index.sql;版本号按左对齐数字比较(V2>V1.9.9) -
自动触发:只要引入
flyway-core依赖且配置好数据源,Spring Boot 启动时自动扫描src/main/resources/db/migration下的脚本并执行未应用的迁移 -
校验防误改:每个脚本执行后,Flyway 将其内容 SHA256 值存入
flyway_schema_history表;若已执行的脚本被修改,启动时validate失败,强制人工干预 -
关键命令内建:
clean(清空库,仅限本地/测试)、info(查看当前迁移状态)、repair(修复元数据不一致,慎用)等可通过 Maven 插件或命令行调用
Liquibase:抽象层强,格式灵活,回滚友好
Liquibase 更偏向声明式,用 XML / YAML / JSON 描述变更(如 “addColumn”、“dropTable”),天然支持跨数据库兼容和自动回滚:
-
变更即对象:每个操作是独立的
changeSet,带唯一id+author,例如一个 YAML 文件里可同时定义建表、加索引、插初始数据 -
回滚开箱即用:每个
changeSet可配rollback子块,或使用预设命令(如dropTable自带反向逻辑),无需额外写 U 脚本 - 数据库无关性:同一份 YAML 在 MySQL、PostgreSQL、H2 上都能运行,Liquibase 自动翻译成对应方言 SQL
-
启动同样自动:引入
liquibase-core并配置spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.yaml,启动即执行未跑过的changeSet
选哪个?看团队实际需求
如果团队熟悉 SQL、数据库类型固定(比如全用 MySQL)、追求轻量和确定性,Flyway 上手快、出错少、维护成本低;如果项目要适配多种数据库、需要频繁回滚验证、或 DBA 希望用结构化方式审阅变更,Liquibase 的抽象能力和可逆性更合适。
两者都不需要手动执行脚本,也不依赖外部工具——只要配置正确,每次部署就是一次可靠的数据库同步。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











