You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:26:08