前言
一家人除了我都去旅游了,我这项请假,请不动啊。既然在家了,闲着也是闲着,就复盘下最近的工作,今天就复盘表结构管理吧,随系统启动的,不是flyway,而是另一个liquibase,个人觉得它比fly更优秀。
现在当家了,才知道当小弟的快乐,现在比当核心的时候更累了,不过这也正常。但是实际上米并没有拿多,这该死的年龄,怀恋啊我们的青春啊。回想这一路走来,因为性格问题,被压制太久了,其实有些时候并不是你能力不够,而是上面不愿意让你发展…
一、Liquibase?
1.Liquibase是什么
- Liquibase 是一个开源的数据库版本控制工具,主要用于自动管理数据库结构(Schema)变更,确保数据库在不同环境(开发、测试、生产)中的结构一致性。
- Liquibase 是数据库的 Git。就像你用 Git 来管理代码版本一样,Liquibase 用来管理数据库结构的变更记录。
2.它能做什么
自动执行数据库迁移脚本(建表、加字段、加索引等)
将变更记录存入数据库,确保不重复执行
支持回滚数据库操作
适用于 CI/CD 自动部署流程
多种格式支持:XML、YAML、JSON、SQL
3.基本原理
每次你要对数据库做结构修改,就写一个“changelog”文件(变更日志)。
Liquibase 执行后会在数据库中建一个表叫 DATABASECHANGELOG,记录每次执行过的变更。
之后每次运行时,Liquibase 会比对哪些变更没有执行过,只执行新的部分。
4.它适合什么场景
使用微服务、多个环境(本地、测试、线上)的团队
不希望 DBA 手工发 SQL 的项目
想把数据库脚本版本控制起来的工程化团队
5.它与 Flyway 有什么区别?
Liquibase 和 Flyway 是两大主流的 数据库迁移工具,它们都能自动执行数据库变更,但各有特点。下面是它们之间的核心区别对比:
功能 | Liquibase | Flyway |
---|---|---|
支持多种格式 | YAML / XML / JSON / SQL | 仅支持 SQL 和 Java |
可声明式(非纯 SQL) | 是 | 否(主要是 SQL) |
脚本命名规则灵活 | changelog-xxx.yaml | 必须 V1__init.sql |
顺序控制方式 | id 字段控制顺序 | 文件名控制顺序 |
支持数据库种类 | 更广泛(几十种) | 主流数据库为主 |
数据库记录执行历史|DATABASECHANGELOG 表|flyway_schema_history 表| | ||
支持回滚 | 原生支持 | 手动写 rollback 脚本 |
自动执行迁移 | 是 | 是 |
Spring Boot 默认集成工具 | 非默认 | 默认集成 |
结论汇总:
- Liquibase 更灵活,支持声明式写法,不用写原生 SQL。Flyway 更适合 DBA 写 SQL。
- Flyway 严格依赖文件名排序执行脚本,而 Liquibase 通过 id + author 明确指定每条变更。
- 两者都支持 MySQL、PostgreSQL、Oracle、SQL Server 等主流数据库。
- Liquibase 原生支持 rollback,而 Flyway 不支持自动回滚,需人工写反向脚本。
- Spring Boot 默认集成 Flyway(spring-boot-starter-data-jpa 会自动检测 Flyway 脚本),Liquibase 需要显式加依赖。
二、使用步骤
1.引入库
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
2.建目录
一般是在resources下建db目录,下面方master.xml,建mysql目录。当然也可以在resources下建其他名称的目录,在xml文件里指定的目录对得上就行。
master.xml
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
<!-- <include file="db/mysql/changelog.sql" relativeToChangelogFile="false"/>-->
<includeAll path="db/mysql"/>
</databaseChangeLog>
mysql是用来存sql的
这里在mysql目录下就建一个文件changelog.sql,我是不太愿意一个人建一个文件的,都在一个文件里写好提交的id注释就行了。
--liquibase formatted sql
-- changeset zw:202506291113
ALTER TABLE enterprise_matters CHANGE is_topic is_topic int(11) NULL COMMENT '是否主题,0否,1是' AFTER applicable_region;
-- comment:修改字段排序
一直在这个文件下以-- changeset zw:提交id,-- comment:注释 结尾就行。
注意,若果是在原始语句上修改,注意提交的id要往后变,当然一般情况是不支持这样搞的,还是建议再次写一个语句
总结
- 就是这么简单,sql就管理起来了,个人觉得特别适合敏捷开发
- 领头、领衔确实难点,需要考虑的事情多,最最重要的的是还要技术支撑,不然顶不住啊
就写到这里,加油,uping!