如何让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
相关产品推荐
相关产品推荐

