Liquibase生成更改日志动态日期

时间:2016-03-11 12:34:15

标签: liquibase

我正在尝试使用liquibase生成changelog。要求是使用动态日期构建liquibase脚本。这意味着每当脚本运行时,日期将根据当前日期计算。 有没有一种方法liquibase会以这种方式自动生成日期字段?

例如

<insert tableName="account">
        <column name="id" value="1"/>
        <column name="availablebalance" valueNumeric="36239.07"/>
        <column name="currentbalance" valueNumeric="36000.00"/>
        <column name="maturitydate" valueDate="2015-09-30"/>
        <column name="opendate" valueDate="2012-09-30"/>
        <column name="status" value="OPEN"/>
        <column name="title" value="Alpha Deposit"/>
        <column name="version" valueNumeric="0"/>
        <column name="type_id" valueNumeric="20"/>
        <column name="product_id" valueNumeric="2010101121"/>
    </insert>

应该是

<insert tableName="account">
        <column name="id" value="1"/>
        <column name="availablebalance" valueNumeric="36239.07"/>
        <column name="currentbalance" valueNumeric="36000.00"/>
        <column name="maturitydate" valueDate="current_date + interval '-5 months'"/>
        <column name="opendate" valueDate="current_date + interval '-5 months'"/>
        <column name="status" value="OPEN"/>
        <column name="title" value="Alpha Deposit"/>
        <column name="version" valueNumeric="0"/>
        <column name="type_id" valueNumeric="20"/>
        <column name="product_id" valueNumeric="2010101121"/>
    </insert>

1 个答案:

答案 0 :(得分:1)

不,Liquibase没有任何功能可以做任何你喜欢的事情。您需要编写一些内容来对XML进行后处理以更改日期值。

一种可能性是扫描XML以查找具有<column>属性的valueDate元素,并将这些值替换为未展开的属性,以便XML看起来像这样:

<insert tableName="account">
        <column name="id" value="1"/>
        <column name="availablebalance" valueNumeric="36239.07"/>
        <column name="currentbalance" valueNumeric="36000.00"/>
        <column name="maturitydate" valueDate="${todayMinusFiveMonths}"/>
        <column name="opendate" valueDate="${todayMinusFiveMonths}"/>
        <column name="status" value="OPEN"/>
        <column name="title" value="Alpha Deposit"/>
        <column name="version" valueNumeric="0"/>
        <column name="type_id" valueNumeric="20"/>
        <column name="product_id" valueNumeric="2010101121"/>
    </insert>

...然后在文件顶部添加一个<property>标记,用于定义实际值应该是什么。这看起来像这样:

<databaseChangeLog 
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.5.xsd
        http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">

    <property name="todayMinusFiveMonths" value="2015-11-10"/>
    ...
    remainder of changelog
    ...

请注意,即使在那里,您也必须为日期输入预先计算的值 - 我不认为Liquibase能够在运行时进行任何类型的日期评估。