Liquibase使用changeLogPropertyDefined校验context属性不生效如何解决
问题原因说明
- 你使用的
<changeLogPropertyDefined>预条件仅能识别在changelog中通过<property>标签声明的自定义属性,或者通过-Dliquibase.parameter.xxx格式传入的changelog级参数。你通过-Dcontext=local传入的是Liquibase内置的上下文参数,不属于changelog自定义属性范畴,所以预条件无法匹配到对应值。
解决方案
方案1:使用Liquibase内置context属性(最推荐)
Liquibase本身支持直接给changeSet指定执行上下文,无需额外写预条件,直接修改changeSet标签即可:
<changeSet id="1" author="dm" context="local"> <createTable tableName="accountold"> <column autoIncrement="true" name="id" type="BIGINT"> <constraints nullable="false" primaryKey="true"/> </column> <column name="version" type="BIGINT"> <constraints nullable="false"/> </column> </createTable> </changeSet>
该写法下,只有传入的context匹配local时,对应changeSet才会执行,完全符合你的需求。
方案2:使用context预条件校验
如果你确实需要通过预条件控制执行逻辑,可使用Liquibase提供的<context>预条件标签,修改你的preConditions部分如下:
<preConditions onFail="MARK_RAN" onSqlOutput="TEST"> <context expression="local"/> </preConditions>
方案3:适配changeLogPropertyDefined的使用要求
如果你一定要用changeLogPropertyDefined实现校验,需要先把传入的系统参数转为changelog自定义属性,在你的changelog根标签下、所有changeSet前添加如下声明:
<property name="context" value="${context}" />
添加后你原有预条件的校验逻辑就可以正常识别到context属性值了。
内容的提问来源于stack exchange,提问作者Deepabali
相关产品推荐
相关产品推荐

