官网: https://docs.liquibase.com/change-types/home.html
作用: 其实就是Liquibase定义的节点,让其同一种语句支持种数据库的部署,如使用liquibase定义的,不使用数据库本身的DDL语句CREATE TABLE ,因为这种DDL语句可能仅适用你当前所需部署的数据库,而不支持如mongoDB这些数据库,让官方定义的内部自动转成mongodDB支持的语句
全部的属性节点查看官网: https://docs.liquibase.com/concepts/changelogs/changelog-formats.html
特别注意: 复杂的匹配表达式逻辑是写在命令行参数–labels上,而changeSet节点的labels是不可以写表达式逻辑只能是 “标签名1,标签名2,标签名3” - 所以我就为什么说labels适合无部署权限的人使用
官网: https://docs.liquibase.com/concepts/changelogs/attributes/labels.html?Highlight=Labels
作用: 提供了对其变更集进行分组和分类的能力,以控制执行哪些变更集。在 Liquibase 执行期间,可以提供一个标签表达式,该表达式将充当过滤器,以精确控制将执行哪些变更集
使用0: 符合标签表达式的hangeSet节点才可以被liquibase部署运行
使用1: changeSet节点的属性labels定义当前变更节点所属于的标签名
使用2: iquibase update --labels=标签表达式 或者 liquibase update --labelFilter=标签表达式,用于说明什么标签名的结果集需要被执行。但如果–labels、–labelFilter不定义则默认全部执行,无需过滤操作
注意: --labelFilter这个参数最新的liquibase版本已经被剔除了,所以只用–labels即可
//帮助文档
liquibase update --help
//符合的标签才进行部署的数据库中
liquibase update --label="标签表达式"
//最新版本--labelFilter已经不支持,不要使用
liquibase update --labelFilter="标签表达式"
讲解
<changeSet id="2" author="LinRuChang" labels="20220713,v1" >
<comment>创建表user_20220713_v1comment>
<sql>
CREATE TABLE `user_20220713_v1`
(
`id` char(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '主键',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '角色名',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='liquibase测试表'
sql>
<rollback>
<comment>删除表comment>
<dropTable tableName="user_20220713_v1">dropTable>
rollback>
changeSet>
过滤节点讲解
# 仅部署执行 标签名【同时是v1和20220713的changeset节点】或者 【标签名不是v1的节点】或者 【没有设置labels属性的changeset节点】
liquibase update --labels="(v1 and 20220713) or (not v1)"
特别注意: 复杂的匹配表达式逻辑是写在changeSet节点的context属性上的,而命令行参数–labels上是不可以写表达式逻辑只能是 “上下文名1,上下文名2,上下文名3” 这种值格式 - 所以我就为什么说context适合有部署权限的人使用
官网: https://docs.liquibase.com/concepts/changelogs/attributes/contexts.html
作用: 提供了对其变更集进行分组和分类的能力,以控制执行哪些变更集。在 Liquibase 执行期间,可以提供一个上下文表达式,该表达式将充当过滤器,以精确控制将执行哪些变更集
使用0: 符合上下文表达式的hangeSet节点才可以被liquibase部署运行
使用1: changeSet节点的属性context定义当前变更节点所属于的上下文名
使用2: iquibase update --contexts=“上下文名1,上下文名2,上下文名3” ,用于说明什么上下文名的结果集需要被执行。但如果–contexts不定义则默认全部执行,无需过滤操作
//帮助文档
liquibase update --help
//符合的标签才进行部署的数据库中
liquibase update --contexts="上下文名1,上下名2"
讲解
<changeSet id="3" author="LinRuChang" context="20220713 and v2 and v2lrc" >
<comment>创建表user_20220713_v2_v2lrccomment>
<sql>
CREATE TABLE `user_20220713_v2_v2lrc`
(
`id` char(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '主键',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '角色名',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='liquibase测试表'
sql>
<rollback>
<comment>删除表comment>
<dropTable tableName="user_20220713_v2_v2lrc">dropTable>
rollback>
changeSet>
<changeSet id="5" author="LinRuChang" context="not v2" >
<comment>创建表user_20220713_not_v2comment>
<sql>
CREATE TABLE `user_20220713_not_v2`
(
`id` char(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '主键',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '角色名',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='liquibase测试表'
sql>
<rollback>
<comment>删除表comment>
<dropTable tableName="user_20220713_not_v2">dropTable>
rollback>
changeSet>
<changeSet id="4" author="LinRuChang" context="20220713 or v2 or v2lrc" >
<comment>创建表user_20220713_v2_v2lrc_orcomment>
<sql>
CREATE TABLE `user_20220713_v2_v2lrc`
(
`id` char(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '主键',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT '角色名',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='liquibase测试表'
sql>
<rollback>
<comment>删除表comment>
<dropTable tableName="user_20220713_v2_v2lrc">dropTable>
rollback>
changeSet>
过滤节点讲解
# 仅部署执行 上下文名是20220713或v1的以及没有定义context属性的changeset节点
liquibase update-sql --contexts="20220713,v1"
官网: https://docs.liquibase.com/concepts/changelogs/attributes/runonchange.html
可能场景使用建议: 有些情况下存储过程(虽然不常用)的内容逻辑发生变更,可以定义使用该属性让其一旦内容跟发生变化则重新部署运行,而不需新起一个changeset节点部署运行
重新执行成功后: 在databasechangelog表根据ID、AUTHOR、FILENAME的值找到对应行记录修改其中的DATEEXECUTED、ORDEREXECUTED、EXECTYPE、MD5SUM、DEPLOYMENT_ID这几个列
官网: https://docs.liquibase.com/concepts/changelogs/changelog-formats.html?Highlight=runAlways
注意: 如果你需要每次部署的执行,且该changeset的部署内容会发生变更,请将runAlways、runOnChange都设置为true,否则一旦你内容变化,则会导致当前changset内容md5跟之前部署不一致,导致后续的liquibse节点部署失败
小知识: 官方说一般配合runAlways使用,当然不配合也是可以
官网: https://docs.liquibase.com/concepts/changelogs/preconditions.html
官网: https://docs.liquibase.com/concepts/changelogs/preconditions.html?Highlight=changeSetExecuted
官网: https://docs.liquibase.com/concepts/changelogs/preconditions.html
作用: 指定的更改集是否已被执行。
<preConditions onFail="HALT">
<changeSetExecuted id="1" author="liquibase" changelog-file="changelog.xml" />
preConditions>
官网: https://docs.liquibase.com/concepts/changelogs/preconditions.html
作用: 执行一个SQL字符串并检查返回值。SQL结果必须是单行单列的数据
<preConditions onFail="WARN">
<sqlCheck expectedResult="1">
SELECT COUNT(1) FROM pg_tables WHERE TABLENAME = 'myRequiredTable'
sqlCheck>
preConditions>
官方: https://learn.liquibase.com/unit/view/id:2661
注意: 划分的模块,使用 或 进行将所有切割changelog模块组织起来
文章: https://learn.liquibase.com/unit/view/id:2634
官网: https://docs.liquibase.com/concepts/changelogs/attributes/logicalfilepath.html?Highlight=logicalFilepath
意义: 由于拆分历史臃肿庞大的changelog文件,比较费时费力(要做足够多的测试),毕竟涉及到数据库的变更,历史的东西能不动就不动。但是如果你的changelog文件不是很臃肿,当然还是建议你按组内新的规范进行拆分为好,方便后续维护。
小贴士: 官方说自己的liquibase产品效率足够快,liquibase部署的慢很可能是使用者自身的问题
案例: 例如:一个changset节点是创表a,另一个是删除a,其实两者一合起来就是啥都没做,可以考虑将这两个changeset节点直接从xml删掉即可
官网validCheckSum: https://docs.liquibase.com/concepts/changelogs/changelog-formats.html?Highlight=validCheckSum
官网clear-checksums: https://docs.liquibase.com/commands/maintenance/clear-checksums.html?Highlight=clear
案例: 例如changelog文件中有3个历史changeset节点,一个是创空表a,一个是在a中加字段B,一个是在a中加字段C,可以将这3个changeset合并一个changeset,即创表的时候就增加字段B、C即可
使用节点进行删除合并
使用clear-checksums命令进行删除合并 = 这个更简单
理念: 将不同的数据库名的单独作为一个xml管理,且设置context用来标记这个XML部署到哪个数据库的,最后liquibase update部署运行的时候需要指定 --contexts 采用哪个changelog文件运行 以及 -default-schema-name 或者 --default-catalog-name 指定部署的数据库名
iquibase.bat update --contexts="lrc_blog2" --defaultSchemaName="lrc_blog2"
lrc_blog1-changelog.xml
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:pro="http://www.liquibase.org/xml/ns/pro"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd
http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd"
context="lrc_blog3"
>
<changeSet id="0" author="lrc" >
<tagDatabase tag="blog3_version">tagDatabase>
changeSet>
<changeSet id="1" author="lrc" >
<createTable tableName="user3">
<column name="id" type="int" remarks="主键">
<constraints primaryKey="true">constraints>
column>
<column name="year" type="int" remarks="年龄">column>
createTable>
changeSet>
databaseChangeLog>