Liquibase-数据库脚本版本管理控制
1. 简介
Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制。
Liquibase使参与应用程序发布过程的任何人都可以轻松地:
- 不依赖于特定的数据库,Liquibase会自动适配目标数据库进行脚本初始化,目前支持至少30种主流数据库。
- 提供数据库比较功能,比较结果保存在XML中,基于该XML可以用Liquibase轻松部署或升级数据库。
- 以XML记录/存储数据库变化,其中以
author
和id
唯一标识一个变化(ChangSet),支持数据库变化的合并,因此支持多开发人员同时工作。 - 在数据库中保存数据库修改历史(DatabaseChangeHistory),在数据库升级时自动跳过已应用的变化(ChangSet)。
- 提供变化应用的回滚功能,可按时间、数量或标签(tag)回滚已应用的变化。通过这种方式,开发人员可轻易的还原数据库在任何时间点的状态。
- 可生成数据库修改文档(HTML格式)
- 提供数据重构的独立的IDE和Eclipse插件
- 将所有变化(包括结构和数据)存在XML文件中,便于版本控制的工具
springboot支持,只需要导入依赖。
application.yml配置(可选)
不配置,默认去resource/db/changelog下找db.changelog-mastert.yml文件
2. Quick Start
使用步骤
- step1: 创建一个数据库变更日志(change log)文件。
- step2: 在变更日志文件内部创建一个变更集(change set)。
- step3: 通过命令行或构建脚本对数据库进行变更集。
- step4: 检验数据库中的变更
面向spring开发😉,通过springboot 整合 liquibase 了解其作用。

2.1 添加maven依赖
2.2 application.yaml
2.3 添加 liquibase xml
db.changelog-master.xml
liquibase 配置文件入口,主要用来引用其他的
changelog.xml
,如下配置文件中的include
,当然也可以使用includeAll
来引用整个目录
changelog-init-0.0.1.xml
主要记录了
ddl
的变化信息,比如 如下配置文件中创建了两个表role
和user
2.4 启动测试
项目启动完成后,查看数据库如下图,我们在changelog-init-0.0.1.xml
文件中定义的脚本初始化到了数据库中
通过该demo快速的完成了springboot 集成 liquibase,且完成数据库的初始化。
2.5 测试changeset版本控制
前提是我们将
application.yml
中的drop-first
置为false
,因为drop-first=true
相当于每次都重置数据库
此时我们想在user表中新增一个create_by
字段,便直接在之前的changeset中添加了字段,如下图所示,然后启动项目看结果
启动时控制台报错信息如下:
报错信息是我们直接修改了changeset后导致md5值与之前的不匹配(直接在之前的changeset中做了修改)
🤔 liquibase如何判断 是同一changeset的?
author
和id
唯一标识一个变化(ChangSet)
🤔 liquibase是如何进行changeset版本控制的?
Liquibase
会对已经执行的changelog
的每一个changeSet
的内容进行md5
计算,生成的值是databasechanglog
表的MD5SUM
字段。
当重新启动Liquibase
时,会对每个changeSet
进行md5
值计算,与databasechanglog
表中的MD5SUM
字段进行对比,如果不一致,说明changeSet
值已经被修改,无法启动成功。
3. DDL操作
3.1 创建表
3.2 删除表
3.3 修改表
3.3.1 添加字段
3.3.2 删除字段
3.3.3 修改字段
修改字段类型 不建议使用 因为会把字段的其他信息搞丢,比如字段注释
3.4 执行自定义sql
如果想执行自定义的sql 可以直接使用sql标签, 标签内可以写任何执行语句, 虽然这样可以执行任意sql 但是也损失了liquibase的数据库兼容能力, 如下示例就无法在mysql数据库下运行
当然也支持直接执行sql文件, 如下
3.5 创建函数
创建一个postgre数据库的函数 endDelimiter
需要跟sql文件中的分隔符一致 dbms
指定sql方言
postgre.sql内容如下 创建了一个str 2 date 的函数
3.6 设置上下文
如上示例 创建函数的sql只能在postgre数据库中执行, 切换到mysql就无法执行
因此我们可以通过liquibase的contexts
的属性设置当前的上下文, 实现当前运行环境下执行指定的上下文的changese
首先 在changeSet标签中设置context属性值, 表示只在postgre环境下执行该changeSet
然后在配置文件中设置当前的上下文
这样的话当项目启动时就只会执行context="postgre"
和没有设置context
的changeSet, 实现了非兼容脚本的多库适配
4. DML操作
4.1 数据初始化
项目部署难免会有系统内置的数据,这时我们可以通过使用liquibase进行初始化
新建csv文件user-init-0.0.1.csv
使用loadData
标签进行数据的初始化
4.2 新增数据
4.3 初始化总是变动的数据
使用上述的loadData
标签加载数据,当数据发生变化时,直接修改csv文件进行发布时,会报错版本不一致。
这时可以使用loadUpdateData
标签进行处理,注意的是changeset
上需要加参数runOnChange="true"
(当数据发生改变时不去校验md5)如下
5. 集成maven
使用maven集成liquibase可以方便的通过liquibase maven plaugin实现很多功能。例如:脚本运行,生成文档,数据库差异比较等
5.1 添加 properties
添加properties 文件用来配置liquibase plugin的配置信息。例如 数据库的链接信息,配置文件路径的配置等
liquibase.properties
5.2 修改pom
6. plugin-逆向生成xml
通过liquibase maven 插件,从已有的数据库生成xml配置信息
通过idea的maven功能,找到 liquibase plugin,双击如图liquibase:generateChangeLog
选项,执行完成之后就会在properties
文件中配置的outputChangeLogFile
路径生成对应的xml文件,如下图所示
7. plugin-生成数据库修改文档
双击liquibase plugin面板中的liquibase:dbDoc
选项,会生成数据库修改文档,默认会生成到target
目录中,如下图所示
访问index.html
会展示如下页面,简直应有尽有
8. plugin-发布changelog
之前我们对changelog的编辑都需要通过启动项目来运行changelog,有时候我们可能想不重启项目便能将修改发布运行到数据库中
双击liquibase plugin面板中的liquibase:update
选项,便可以将修改同步到数据库中
注:这里有个bug(也可能不是bug,我目前还没找到对应的解决办法,如果您有解决方案 🙏):通过plugin
发布changelog
时,由于我们在db.changelog-master
中include
的是classpath
路径,但是通过plugin
发布时会报错找不到include
的xml文件,此时我们可以通过设置相对路径来解决这个问题,比如<include file="classpath:changelog/changelog-init-0.0.1.xml" relativeToChangelogFile="true"/>
,然而这又引发了另外一个问题,plugin
和直接启动springboot项目生成的databasechangelog表中的filename字段值
不同,导致运行changelog
时报错,因为liquibase默认会比较同一filename
下的changeset
9. plugin-比较数据库差异
首先使用liquibase diff 功能前,我们在properties中加入参考的数据库 test3
配置信息
用于差异比较的数据库,以此数据库为准,生成diff xml
我们先观察下两个数据库有什么样的差异,再验证生成的diff xml
两个数据库如下,差异都用红色框起来了。
然后再用liquibase插件看下生成的 diff xml信息
双击liquibase plugin面板中的liquibase:diff
选项,如下图所示

执行完毕后,查看diff xml 内容如下:
生成的xml文件符合预期,将与test3数据库的差异都生成到了diff xml中

__EOF__

本文链接:https://www.cnblogs.com/ludangxin/p/16676701.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)