一、概述
preConditions
用于Liquibase执行前的判断, 可以附加到databaseChangeLog
或changeSet
中,以控制数据库的更新和执行。
以下是使用preConditions
的几个场景:
-
记录changelog的作者在创建changelog时的假设。
-
强制运行changelog的用户不违反这些假设。
-
在执行不可恢复的更改(例如dropTable)之前,请执行数据检查。
-
根据数据库的状态来控制运行哪些changesets和不运行哪些changesets。
具体描述和使用也可查看 官网
二、可选属性
-
onFail
: 当preConditions
遇到失败的时候如何处理 -
onError
:当preConditions
遇到错误的时候如何处理
onFail或者onError如果是在changeset
里面使用, 可选的取值有4个, 如果是在changset
之外使用(例如changelog
的开头),则只有HALT
和WARN
2个。-
HALT
:立即停止执行整个changelog
。默认的值。 -
WARN
:输出警告并继续正常执行changeset
/changelog
。 -
CONTINUE
:跳过changeset
。将在下次更新时再次尝试执行changeset
。继续changelog
。 -
MARK_RAN
:跳过changeset
,但将其标记为已执行。继续changelog
。
-
-
onUpdateSQL
:自版本1.9.5后当preConditions
遇到更新SQL
模型的时候如何处理 -
onFailMessage
:自2.0起,在preConditions
失败时要输出的自定义消息。 -
onErrorMessage
:在preConditions
错误时要输出的自定义消息。
三、条件组合
可以将AND
、OR
和NOT
标签将条件逻辑应用于preConditions
。如果未指定条件标签,则默认为 AND。
四、可以判断的对象
1. <dbms>
如果针对所执行的数据库与指定的类型匹配,则通过。 type:预期的数据库类型。可以使用逗号分隔值指定多个 dbms 值。必填
2.<columnExists>
从1.8开始如果数据库中存在具体的列,则通过 schemaName: 表的schema的名称。必填 tableName: 列表的名称。必填 columnName: 列名称。必填
3.<tableExists>
从1.8开始,如果数据库中存在具体的表,则通过 schemaName: 表的schema的名称。必填 tableName: 表的名称。必填
4.<viewExists>
从1.8开始,如果数据库中存在具体的视图,则通过 schemaName: 视图的schema的名称。必填 viewName: 视图的名称。必填
5.<foreignKeyConstrainExists>
从1.8开始,如果数据库存在指定的外键,则通过 schemaName: 外键的schema名称,必填 foreignKeyName: 外键的名称。必填
6.<indexExists>
从1.8开始,如果数据库存在指定的索引,则通过 schemaName: 索引的schema名称,必填 indexName: 索引名称,必填
7.<sequenceExists>
从1.8开始,如果数据库存在指定的序列,则通过 schemaName: 序列的schema名称,必填 sequenceName: 序列的名称,必填
8.<primaryKeyExists>
从1.8开始,如果数据库中存在指定的主键,则通过 schemaName: 主键的schema名称 primaryKeyName: 主键的名称,表名或者主键名是必填 tableName: 包含主键的表的名称。从1.9开始表名或者主键名是必填
9.<sqlCheck>
执行 SQL 字符串并检查返回的值。SQL 必须返回具有单个值的单个行。要检查行数,请使用SQL 函数count。要检查值范围,请在 SQL 中执行检查,并返回一个可以容易比较的值。
<sqlCheck expectedResult="1">
SELECT COUNT(1) FROM pg_tables WHERE TABLENAME = 'myRequiredTable'
</sqlCheck>
expectedResult: 这个值与SQL的执行结果作比较,必填
10.<runningAs>
如果执行的数据库用户与指定的用户名匹配,则通过。 username: 数据库用户脚本应以原样运行。必填
11.<changeLogPropertyDefined>
检查是否存在给定的changelog参数。如果还给定了值,则仅当该值与给定值不同时,该值才会失败。 property: 要检验的属性的名称,必填 value: 给定属性的必需值。
12.<customPrecondition>
可以通过创建实现 liquibase.precondition.CustomPrecondition接口的类来创建自定义precondition。自定义类上的参数通过基于<param>子标签的反射进行设置。参数作为字符串传递到自定义preCondition。
<customPrecondition className="com.example.CustomTableCheck">
<param name="tableName" value="our_table"/>
<param name="count" value="42"/>
</customPrecondition>
className: 自定义precondition类的名称。必填
子标签param: 传递给custom precondition的参数
param子标签属性:
- name: 要设置的参数的名称。必填
- value: 要将参数设置为的字符串值。必填
网友评论