Liquibase preConditions 执行前判断详解

一、概述

preConditions用于Liquibase执行前的判断, 可以附加到databaseChangeLogchangeSet中,以控制数据库的更新和执行。

以下是使用preConditions的几个场景:

  1. 记录changelog 的作者在创建changelog时的假设。

  2. 强制运行changelog的用户不违反这些假设。

  3. 在执行不可恢复的更改(例如dropTable)之前,请执行数据检查。

  4. 根据数据库的状态来控制运行哪些changesets 和不运行哪些changesets

具体描述和使用也可查看 官网

二、可选属性

  • onFail: 当preConditions遇到失败的时候如何处理

  • onError:当preConditions遇到错误的时候如何处理

    onFail或者onError如果是在changeset里面使用, 可选的取值有4个, 如果是在changset之外使用(例如changelog的开头),则只有 HALTWARN 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错误时要输出的自定义消息。

三、条件组合

可以将ANDORNOT标签将条件逻辑应用于preConditions。如果未指定条件标签,则默认为 AND。

四、可以判断的对象

1.

如果针对所执行的数据库与指定的类型匹配,则通过。 type:预期的数据库类型。可以使用逗号分隔值指定多个 dbms 值。必填

2.

从1.8开始如果数据库中存在具体的列,则通过 schemaName: 表的schema的名称。必填 tableName: 列表的名称。必填 columnName: 列名称。必填

3.

从1.8开始,如果数据库中存在具体的表,则通过 schemaName: 表的schema的名称。必填 tableName: 表的名称。必填

4.

从1.8开始,如果数据库中存在具体的视图,则通过 schemaName: 视图的schema的名称。必填 viewName: 视图的名称。必填

5.

从1.8开始,如果数据库存在指定的外键,则通过 schemaName: 外键的schema名称,必填 foreignKeyName: 外键的名称。必填

6.

从1.8开始,如果数据库存在指定的索引,则通过 schemaName: 索引的schema名称,必填 indexName: 索引名称,必填

7.

从1.8开始,如果数据库存在指定的序列,则通过 schemaName: 序列的schema名称,必填 sequenceName: 序列的名称,必填

8.

从1.8开始,如果数据库中存在指定的主键,则通过 schemaName: 主键的schema名称 primaryKeyName: 主键的名称,表名或者主键名是必填 tableName: 包含主键的表的名称。从1.9开始表名或者主键名是必填

9.

执行 SQL 字符串并检查返回的值。SQL 必须返回具有单个值的单个行。要检查行数,请使用SQL 函数count。要检查值范围,请在 SQL 中执行检查,并返回一个可以容易比较的值。

复制代码
<sqlCheck expectedResult="1">
 SELECT COUNT(1) FROM pg_tables WHERE TABLENAME = 'myRequiredTable'
</sqlCheck>

expectedResult: 这个值与SQL的执行结果作比较,必填

10.

如果执行的数据库用户与指定的用户名匹配,则通过。 username: 数据库用户脚本应以原样运行。必填

11.

检查是否存在给定的changelog参数。如果还给定了值,则仅当该值与给定值不同时,该值才会失败。 property: 要检验的属性的名称,必填 value: 给定属性的必需值。

12.

可以通过创建实现 liquibase.precondition.CustomPrecondition接口的类来创建自定义precondition。自定义类上的参数通过基于子标签的反射进行设置。参数作为字符串传递到自定义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: 要将参数设置为的字符串值。必填
相关推荐
冰暮流星2 小时前
javascript之二重循环练习
开发语言·javascript·数据库
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
冉冰学姐3 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly3 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客3 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.3 小时前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
一 乐3 小时前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_99993 小时前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学4 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.4 小时前
Mysql
数据库·mysql