如何将条件添加到changeSet

时间:2019-05-06 07:45:33

标签: liquibase

我为liquibase创建了数据库ChangeLog,并且具有“ CREATE TABLE”查询。 我想向“状态”列添加条件。

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd">


    <changeSet id="1" author="xxx">
        <comment>Create Asset table</comment>
        <sql>
            CREATE TABLE `TASK`(
            `TASK_ID` bigint(20) NOT NULL,
            `STATUS` VARCHAR(10), //(where status not equal to "pending")
            `FILE_ID` varchar(100),
            PRIMARY KEY (`DOC_ID`)
            )ENGINE=InnoDB DEFAULT CHARSET=utf8;
        </sql>
    </changeSet>
</databaseChangeLog>

1 个答案:

答案 0 :(得分:0)

如果要根据某些条件更新列数据类型,可以将<preConditions><sqlCheck>一起使用,然后使用<modifyDataType>

因此,假设已经有一个名称为TASK的表,并且其中包含名为STATUS的列,则可以这样修改其数据类型:

<changeSet id="1" author="xxx">
    <comment>Update Asset table</comment>
    <preConditions onFail="MARK_RAN">
        <and>
            <columnExists tableName="TASK" columnName="STATUS"/>
            <sqlCheck expectedResult="0"> SELECT COUNT(*) FROM TASK WHERE STATUS = "pending";</sqlCheck>
        </and>
    </preConditions>
    <modifyDataType tableName="TASK" columnName="STATUS" newDataType="VARCHAR(10)"/>
</changeSet>

或者您可能想要其他onFail行为。看看这个link

  

HALT -立即停止执行整个更改日志[默认]

     

继续-跳过更改集。执行变更集将是   在下一次更新时再次尝试。继续更改日志。

     

MARK_RAN -跳过更改集,但将其标记为已运行。继续   更改日志

     

警告-输出警告并继续执行正常设置的更改。