Liquibase YAML格式ChangeSet中预条件校验失效问题排查
让我帮你排查这个预条件不生效的问题——你的YAML配置里有几个语法和结构错误,直接导致了预条件没按预期工作:
1. onFail 属性的位置完全错了
你把 - onFail: MARK_RAN 当成了一个独立的预条件条目,但onFail是preConditions的全局属性,不是一个预条件类型。它应该和预条件的列表同级,而不是作为列表项存在。
2. not 预条件的YAML结构有误
你的sqlCheck下写的 -not: 有两个问题:
- 多余的减号(
-)会让not变成sqlCheck的子列表项,但实际上not是一个预条件包裹器,应该作为preConditions下的列表项,内部再包含sqlCheck; - 原结构的逻辑完全混乱,Liquibase根本无法识别你要表达“count(*)不等于0”的校验规则。
3. Delete语句的WHERE子句有语法错误
template_id =select id ... 里的=和select之间没有空格,这会直接导致SQL执行失败——哪怕预条件通过了,delete操作也跑不起来。
下面是修正后的完整配置,你可以直接用:
- changeSet: id: 18.5.1 author: saggarwal comment: PROD-5303 | DELETE | TEMPLATE_COLUMN_MAPPPING | ATT preConditions: onFail: MARK_RAN # 全局属性,放在preConditions根节点下 - not: # not作为预条件列表项,内部嵌套sqlCheck - sqlCheck: expectedResult: 0 sql: select count(*) from es_email; changes: - delete: tableName: es_email where: template_id = select id from abc where name= 'XYZ'; # 补上=和select之间的空格
修正后的逻辑是:当es_email表存在记录(count(*)≠0)时,执行delete操作;如果表是空的(count=0),这个changeSet会被标记为已执行(MARK_RAN),不会抛出错误。如果你的实际需求是反过来(表为空时才执行),去掉not节点即可。
内容的提问来源于stack exchange,提问作者Saakshi Aggarwal
相关产品推荐
相关产品推荐

