LIQUIBASE的CHANGELOG详解

首先来看看 LIQUIBASE 的配置文件:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<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-4.1.xsd">
    <changeSet id="0001-initial" author="Arnold Galovics">
        <createTable tableName="customers">
            <column name="id" type="number">
            </column>
            <column name="username" type="varchar(100)">
            </column>
        </createTable>
        <sqlFile path="classpath:/org/springframework/batch/core/schema-mysql.sql" relativeToChangelogFile="false"/>
    </changeSet>
</databaseChangeLog>

这个语句的作用,可以用这个来建立数据库。

首先放一下文档:

1
2
https://zhuanlan.zhihu.com/p/157714666
https://blog.csdn.net/a112626290/article/details/104263790

1.什么是 changelog?

changelog 是 Liquibase 进行版本管理的核心文件。

  • 官方介绍

The root of all Liquibase changes is the changelog file. Liquibase uses a changelog to list all changes, in order, made to your database. Think of it as a ledger. It is a file that contains a record of all your database changes (changesets). Liquibase uses this changelog record to audit your database and execute any changes not yet applied to your database.

hangelog 是 Liquibase 版本控制的核心,Liquibase 通过有序的 changelog 罗列你对数据库的更改,你可以把它想象成为一个账本,包含你对数据库所有操作的文件。

Liquibase 使用这个变更日志来审计你的数据库,并执行任何还没有应用到目标数据库的变更操作

简而言之就是一个日志文件,可以理解成 MySql 的 binlog 重做日志,Hadoop 的 NameNode 日志,提供重现步骤

2. changelog 的格式

Liquibase 提供的 changelog 格式有 5 种:

  • SQL
  • XML
  • JSON
  • YAML
  • Other

其中建议使用的是 XML ,其次是 YAML,原因是可读性高。所以这里只讲 XML 和 YAML

2.1.XML 格式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="UTF-8"?>

<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"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <preConditions>
        <runningAs  username="liquibase"/>
    </preConditions>

    <changeSet  id="1"  author="nvoxland">
        <createTable  tableName="person">
            <column  name="id"  type="int"  autoIncrement="true">
                <constraints  primaryKey="true"  nullable="false"/>
            </column>
            <column  name="firstname"  type="varchar(50)"/>
            <column  name="lastname"  type="varchar(50)">
                <constraints  nullable="false"/>
            </column>
            <column  name="state"  type="char(2)"/>
        </createTable>
    </changeSet>
</databaseChangeLog>

2.2 YAML 格式

使用 JSON 需要下载:snakeyaml-1.12.jar ,并加入到 classpath 中

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
databaseChangeLog:
  - changeSet:
      id: 1
      author: nvoxland
      changes:
        - createTable:
            tableName: person
            columns:
              - column:
                  name: id
                  type: int
                  autoIncrement: true
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: firstname
                  type: varchar(50)
              - column:
                  name: lastname
                  type: varchar(50)
                  constraints:
                    nullable: false
              - column:
                  name: state
                  type: char(2)

3.changelog 嵌套元素

changelog 可用的嵌套元素共 5 类:

  • preConditions:执行 changelog 的前置条件;
  • property:用于设置属性的值;
  • changeSet:执行的变更集
  • include:引用其他包含要执行的 changeSet 文件;
  • context:changSet 上下文;

这些嵌套元素将在编写 changelog 时详细说明,接下来,让我们写一个简单的 changelog ,完成我们的数据库升级

4、实战

1、优化

首先,我们可以从二-5 中看到 update,执行过程中,如果每次命令都需要加这么一堆参数就显得很繁琐,没关系,Liquibase 提供了优化的方案。

  • 我们可以通过内置的 liquibase.properties 文件,预定义我们的一些变量,如图:
1
2
3
4
5
6
7
8
# 版本控制主文件
driver:com.mysql.cj.jdbc.Driver
url:jdbc:mysql://localhost:3306/liquibase?useSSL=false
username:root
password:admin
# jdbc 驱动
classpath:./mysql-connector-java-8.0.11.jar
changeLogFile:./sql/my/text.xml

这样在 liquibase.properties 同级目录下,直接执行 liquibase update liquibase rollbackCount 2即可。

  • 就像这样

image-20210117173520748

  • 以下所以的实战默认已有 properties 文件,配置好了所有信息,并在同级目录下执行

2、目标数据库状态

1
2
3
创建表 user ,字段 idnameage

添加初始化数据:(1,"张三",18,2,"李四",19,3,"王五",19

3、使用命令

3.1.update
1
liquibase update
3.2.rollback
1
liquibase rollbackCount 2

4、编写 changelog 文件

空的 changelog 格式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?xml version="1.0" encoding="UTF-8"?>
<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-3.8.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-3.8.xsd ">
</databaseChangeLog>

5、添加 changeSet

5.1.原生 SQL 格式

样例如下,分布执行两步,两个 changeSet,第一建表,第二步插入数据

是更新时使用的, 是回滚时使用的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<changeSet id="create-user" author="jiaotd">
        <sql>
            CREATE TABLE `user` (
            `id` int(11) NOT NULL AUTO_INCREMENT,
            `name` varchar(255) DEFAULT NULL,
            `age` int(11) DEFAULT NULL,
            PRIMARY KEY (`id`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
        </sql>
        <rollback>
            <sql>
                drop database `user`;
            </sql>
        </rollback>
        <comment>创建user表</comment>
    </changeSet>

    <changeSet id="insert-user" author="jiaotd">
        <sql>
            insert into user values(1,"张三",18),(2,"李四",19),(3,"王五",19);
        </sql>
        <rollback>
            <sql>
                delete from user;
            </sql>
        </rollback>
        <comment>创建user表</comment>
    </changeSet>

执行update操作,显示Liquibase: Update has been successful.即代表成功。

可以看到,数据库多了 3 张表:DATABASECHANGELOG,DATABASECHANGELOGLOCK,user

image-20210119094755883

其中 user 是我们自己定义的表,而剩下两张表则是 Liquibase 本身所需要的表。

打开 user 表,看一下我们的数据是否正确。

剩余的两张 Liquibase 的表,DATABASECHANGELOGLOCK 是 Liquibase 在处理并发操作时一个锁表,正常情况下不用关心,DATABASECHANGELOG 则是 Liquibase 对数据进行版本管理的核心,如图:

image-20210119094828244

列描述在上一篇文章已经提到,这里就不再赘述,重点看 DESCRIOTION,字段值是 SQL,代表我们使用了 SQL 格式的 changeSet。

执行rollback命令后,就可以看到 user 表被删除,另外 DATABASECHANGELOG 处于清空状态。

5.2.SQLFile 格式

首先我们先定义 update 与 rollback 执行的 SQL 文件

creat-user.sql

1
2
3
4
5
6
7
8
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

insert into user values(1,"张三",18),(2,"李四",19),(3,"王五",19);

create-user-rollback.sql

1
drop table `user`;

然后,新建一个 test-sqlfile.xml 文件,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="utf-8"?>
<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.4.xsd">

    <changeSet id="init-user" author="jiaotd">
        <sqlFile path="create-user.sql" relativeToChangelogFile="true"/>
        <rollback>
            <sqlFile path="create-user-rollback.sql" relativeToChangelogFile="true"/>
        </rollback>
        <comment>初始化user表</comment>
    </changeSet>

</databaseChangeLog>

最后,执行update操作,同样可以实现刚才的效果,DATABASECHANGELOG 如图所示:

image-20210119095651464

这里注意看 DESCRIOTION,值是 sqlFile,代表我们使用了 SQLFile 格式的 changeSet 。

5.3.原生 XML 标签格式

创建一个新的 changelog 文件,命名为 test-xml.xml,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?xml version="1.0" encoding="utf-8"?>
<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.4.xsd">

    <changeSet id="create-user" author="jiaotd">
        <createTable tableName="user">
            <column name="id" type="int(11)" autoIncrement="1"/>
            <column name="name" type="varchar(1255)"/>
            <column name="age" type="int(11)"/>
        </createTable>
        <addPrimaryKey tableName="user" columnNames="id"/>
        <rollback>
            <dropTable tableName="user"/>
        </rollback>
    </changeSet>


    <changeSet id="add-user" author="jiaotd">
        <insert tableName="user">
            <column name="id" value="1"/>
            <column name="name" value="张三"/>
            <column name="age" value="18"/>
        </insert>
        <insert tableName="user">
            <column name="id" value="2"/>
            <column name="name" value="李四"/>
            <column name="age" value="19"/>
        </insert>
        <insert tableName="user">
            <column name="id" value="3"/>
            <column name="name" value="王五"/>
            <column name="age" value="19"/>
        </insert>
    </changeSet>

</databaseChangeLog>

这里注意看 DATABASECHANGELOG 的 DESCRIOTION,值是 类似于伪代码的内容,代表我们使用了原生 xml 格式的 changeSet

5、标签详解

可以用 include 引入其他版本修改历史文件,如下图:

image-20210119164047317

5.1.XML 格式

tag Description
preConditions 执行 sql 变更文件的前置条件
property 设置的属性的值
changeSet 要执行的更改
include 包含要执行的更改集的附加文件
context 上下文将被附加到(使用 AND)所有变更集
5.1.1.preConditions 标签

可以应用于<databaseChangeLog>标签或者<changeSet>标签。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>

<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.8.xsd">
    <preConditions>
        <dbms type="oracle" />
        <runningAs username="SYSTEM" />
    </preConditions>

    <changeSet id="1" author="bob">
        <preConditions onFail="WARN">
            <sqlCheck expectedResult="0">select count(*) from oldtable</sqlCheck>
        </preConditions>
        <comment>Comments should go after preCondition. If they are before then liquibase usually gives error.</comment>
        <dropTable tableName="oldtable"/>
    </changeSet>
</databaseChangeLog>

上述的示例,是只有在Oracle数据库以及用户是SYSTEM时才会执行。

preConditions 前置条件分为正常和异常情况: 正常情况下,无论返回的值是不是预料的值(0),oldtable 都会被删除,只是如果不是预料的值,这里会给出 WARN; 异常情况下,也就是如果 oldtable 不存在,删除 oldtable 的命令将不会执行。

(1)处理失败和错误
Attribute Description
onFail 当 preConditions 是失败情形下如何处理
OnError 当 preConditions 是错误情形下如何处理
onSqlOutput 在 updateSQL 模式下要做什么
onFailMessage 输出的失败信息
onErrorMessage 输出的错误信息
OnFail/OnError 值可能配置的值
Value Description
HALT 立即停止执行整个更改日志。 [默认]
CONTINUE 跳过* changeSet 。 下次更新时将再次尝试执行更改集。 继续 changelog *。
MARK_RAN 跳过更改集,但将其标记为已执行。继续更改日志。
WARN 输出警告并继续照常执行* changeSet * / _ changelog _。
onSqlOutput 可能配置的值
Value Description
TEST 在 updateSQL 模式下运行 changeSet
FAIL 使 preConditons 在 updateSQL 模式下失败
IGNORE 忽略 updateSQL 模式中的 preConditons(默认)。
(2)and/or/not 逻辑

可以使用 nestable <and><or><not>标记将条件逻辑应用于前置条件。如果没有指定条件标记,则默认为 AND。

1
2
3
4
<preConditions onFail="WARN">
    <dbms type="oracle" />
    <runningAs username="SYSTEM" />
</preConditions>

这里就是默认值 AND,也就是同时满足既是 oracle 数据库,并且用户必须是 SYSTEM 才会执行。

如果使数据更改可以在 oracle 和 mysql 中可以执行,需要用到 or 表达式:

1
2
3
4
5
6
 <preConditions>
     <or>
         <dbms type="oracle" />
         <dbms type="mysql" />
     </or>
 </preConditions>

复合条件,例如,是 oracle 数据库,并且用户必须是 SYSTEM 或者 数据库是 mysql,且用户需要为 root 时,可以这样写:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<preConditions>
     <or>
         <and>
            <dbms type="oracle" />
            <runningAs username="SYSTEM" />
         </and>
         <and>
            <dbms type="mysql" />
            <runningAs username="root" />
         </and>
     </or>
 </preConditions>
(3)可用的 preConditions
  • <dbms>:如果针对指定类型执行的数据库匹配,则可以传递。
1
2
<dbms type="mysql" />
1
  • <runningAs>:执行执行的用户,匹配才可以传递。
1
2
<runningAs username="root" />
1
  • <changeSetExecuted>:如果指定的 changeSet 被执行了才可以传递。
1
2
<changeSetExecuted id="1" author="YoungLu" changeLogFile="classpath:liquibase/changelog/2020-02-11-change.xml" />
1
  • <columnExists>:如果数据库中的指定列存在则传递
1
2
<columnExists schemaName="young_webchat" tableName="y_user" columnName="username" />
1
  • <tableExists>:如果数据库中的表存在,则传递
1
2
<tableExists schemaName="young_webchat" tableName="y_user" />
1
  • <viewExists>:如果数据库中的视图存在,则传递
1
2
<viewExists schemaName="young_webchat" viewName="y_user_view" />
1
  • <foreignKeyConstraintExists>:如果外键存在则传递
1
2
<foreignKeyConstraintExists schemaName="young_webchat" foreignKeyName="y_user_log_fk" />
1
  • <indexExists>:如果索引存在则传递
1
2
<indexExists schemaName="young_webchat" indexName="y_user_idx" />
1
  • <sequenceExists>:如果序列存在则传递
1
2
<sequenceExists schemaName="young_webchat" sequenceName="y_user_seq" />
1
  • <primaryKeyExists>:如果主键存在则传递
1
2
<primaryKeyExists schemaName="young_webchat" primaryKeyName="y_user_id" />
1
  • <sqlCheck>:执行 SQL 检查。SQL 必须返回具有单个值的单个行。
1
2
<sqlCheck expectedResult="1">SELECT COUNT(1) FROM pg_tables WHERE TABLENAME = 'myRequiredTable'</sqlCheck>
1
  • <changeLogPropertyDefined>:检查给定的 changelog 参数是否存在。如果一个值也是给定的,如果这个值与给定的值不相同那么它只会失败。
1
2
3
<changeLogPropertyDefined property="myproperty"/>
<changeLogPropertyDefined property="myproperty" value="requiredvalue"/>
12
  • <customPrecondition>:可以通过创建实现 liquibase.precondition 的类来创建自定义前置条件。CustomPrecondition 接口。自定义类的参数是通过基于子标记的反射设置的。参数作为字符串传递给自定义前置条件。
1
2
3
4
<customPrecondition className="com.example.CustomTableCheck">
    <param name="tableName" value="our_table"/>
    <param name="count" value="42"/>
</customPrecondition>
5.1.2.Properties 标签

为 changelog 定义一个参数。给定上下文 和/或 数据库的列表,该参数将仅在这些上下文 和/或 数据库中使用。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<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"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <property name="clob.type" value="clob" dbms="oracle"/>
    <property name="clob.type" value="longtext" dbms="mysql"/>

    <changeSet id="1" author="joe">
         <createTable tableName="${table.name}">
             <column name="id" type="int"/>
             <column name="${column1.name}" type="${clob.type}"/>
             <column name="${column2.name}" type="int"/>
         </createTable>
    </changeSet>
</databaseChangeLog>
  • 可用的配置项
Attribute Description
name 表的数据库名称
value 所需列的表的名称
context 上下文,逗号分隔
dbms 要用于该 changeSet 的数据库的类型。关键字 all 和 none 也可用。
global 定义属性是全局的还是局限于 databaseChangeLog。“true”或“false”。

示例:

1
2
3
4
5
<property name="simpleproperty" value="somevalue"/>
<property name="clob.type" value="clob" dbms="oracle,h2"/>
<property name="clob.type" value="longtext" dbms="mysql"/>
<property name="myproperty" value="yes" context="common,test"/>
<property name="localproperty" value="foo" global="false"/>
5.1.3.changeSet 标签

将一个个数据库更改分开。

示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  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-3.8.xsd
      http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.8.xsd">
    <changeSet id="1" author="bob">
        <comment>A sample change log</comment>
        <createTable/>
    </changeSet>
    <changeSet id="2" author="bob" runAlways="true">
        <alterTable/>
    </changeSet>
    <changeSet id="3" author="alice" failOnError="false" dbms="oracle">
        <alterTable/>
    </changeSet>
    <changeSet id="4" author="alice" failOnError="false" dbms="!oracle">
        <alterTable/>
    </changeSet>

</databaseChangeLog>

一般主要由“id” 、“author”、changelog 文件路径名组成

(1)可用的属性值:
属性 描述
id 唯一识别,不一定是数字
author 作者
dbms 数据库类型
runAlways 在每次运行时执行 changeset ,即使之前已经运行过
runOnChange 在第一次看到更改时执行更改,并且在每次 changeset 时执行更改
context 控制是否执行 changeset,这取决于运行时设置。任何字符串都可以用于上下文名称,它们被不区分大小写地选中。
labels 控制是否执行 changeset,这取决于运行时设置。任何字符串都可以用于标签名称,并且不区分大小写地选中它们。
runInTransaction 是否应该将 changeset 作为单个事务运行(如果可能的话)?默认值为 true。
failOnError 如果在执行 changeset 时发生错误,迁移是否应该失败
objectQuotingStrategy 这控制了在生成的 SQL 中如何引用对象名,或者在对数据库的调用中如何使用对象名。不同的数据库对对象的名称执行不同的操作,例如 Oracle 将所有内容都转换为大写(除非使用引号)。有三个可能的值。默认值是 LEGACY。三个配置的值: LEGACY - Same behavior as in Liquibase 2.0 QUOTE_ALL_OBJECTS - 每个对象都加上双引号 :person becomes “person”.QUOTE_ONLY_RESERVED_WORDS - 在保留关键字和可用列名上面加双引号
(2)可用的子标签
value description
comment 注释
preConditions 前置条件,例如做一些不可逆操作前的必要检查
<Any Refactoring Tag(s)> 要作为这个更改集的一部分运行的数据库更改
validCheckSum 添加一个校验和,不管数据库中存储了什么,它都被认为对这个 changeset 是有效的。主要用于需要更改 changeset,并且不希望在已经运行了 changeset 的数据库上抛出错误(不推荐使用此过程)
rollback 描述如何回滚更改集的 SQL 语句或重构标记

着重讲一下rollback标签的示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<changeSet id="1" author="bob">
    <createTable tableName="testTable">
    <rollback>
        drop table testTable
    </rollback>
</changeSet>
123456
<changeSet id="1" author="bob">
    <createTable tableName="testTable">
    <rollback>
        <dropTable tableName="testTable"/>
    </rollback>
</changeSet>
123456
<changeSet id="2" author="bob">
    <dropTable tableName="testTable"/>
    <rollback changeSetId="1" changeSetAuthor="bob"/>
</changeSet>
1234

这里发生了回滚,会调用 id 为 1 的 changeSet 。

5.1.4.include 标签

将 change-logs 拆分为易于管理的部分。

例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?xml version="1.0" encoding="UTF-8"?>

<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.8.xsd">
    <include file="com/example/news/news.changelog.xml"/>
    <include file="com/example/directory/directory.changelog.xml"/>
</databaseChangeLog>

可用的配置项:

Attribute Description
file 被引入的文件
relativeToChangelogFile 用文件的相对路径而不是 classpath
context 向所有包含的 changeSets 追加上下文(使用 AND)

Q.E.D.

Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 06, 2025 05:52 UTC
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计
Caret Up