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

如何让Liquibase非匹配上下文的变更集标记为已执行?

Liquibase管理演示数据的核心问题解决方案

需求说明

  • 为演示数据变更集添加demo-data上下文,希望非匹配上下文时标记变更集为已执行(而非单纯忽略)
  • 执行指定命令时确保数据库无演示数据残留,避免架构变更后旧数据意外插入

一、实现非匹配上下文变更集标记为已执行

利用Liquibase的<contextCheck>前置条件结合onFail="MARK_RAN"属性,当上下文不匹配时,变更集直接被标记为已执行,而非跳过。

示例变更集:

<changeSet id="insert-demo-users" author="tobi" context="demo-data">
  <!-- 检查当前上下文是否为demo-data,不匹配则标记为已执行 -->
  <preConditions onFail="MARK_RAN">
    <contextCheck expectedContexts="demo-data"/>
  </preConditions>
  
  <!-- 演示数据插入逻辑 -->
  <insert tableName="users">
    <column name="id" value="1"/>
    <column name="name" value="Demo User"/>
  </insert>
  
  <!-- 回滚逻辑,用于清理演示数据 -->
  <rollback>
    <delete tableName="users" where="id=1"/>
  </rollback>
</changeSet>

二、避免演示数据残留的方案

1. 精准排除演示数据的命令

无需使用不存在的上下文,直接用Liquibase的否定上下文语法明确排除demo-data:

liquibase update --contexts="!demo-data"

该命令会执行所有非demo-data上下文的变更集,同时demo-data变更集因前置条件触发MARK_RAN被标记为已执行。

2. 插入前清理旧演示数据

在演示数据变更集中添加删除逻辑,每次执行demo-data上下文时先清除旧数据,避免残留:

<changeSet id="insert-demo-users" author="tobi" context="demo-data">
  <preConditions onFail="MARK_RAN">
    <contextCheck expectedContexts="demo-data"/>
  </preConditions>
  
  <!-- 插入前先删除旧演示数据 -->
  <delete tableName="users" where="id=1"/>
  
  <insert tableName="users">
    <column name="id" value="1"/>
    <column name="name" value="Demo User"/>
  </insert>
  
  <rollback>
    <delete tableName="users" where="id=1"/>
  </rollback>
</changeSet>

3. 清理已存在的演示数据

如果之前已执行过demo-data上下文插入数据,先执行回滚命令清除已有演示数据:

liquibase rollback --contexts="demo-data"

之后再执行liquibase update --contexts="!demo-data"即可确保数据库无演示数据。

内容的提问来源于stack exchange,提问作者tobi-he

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:32:01