liquibase <插入>:插入当前日期</insert>

时间:2012-02-01 01:49:32

标签: liquibase

我正在尝试使用liquibase插入标记插入数据。当我输入一个数字到值标签时,它工作正常。 但我正在寻找一个简单的函数来处理默认日期(数据库的当前DateTime),即使我没有将它作为我的表定义的一部分。

例如:

<changeSet id="abc_1" author="Me">
<insert tableName="Emp" schemaName="XYZ">
    <column name="name" value="Me"/>
    <column name="create_date" value ="1328055111692"/>
    <column name="profile_last_update" value="currentDateTimeFunction"/>
    <column name="group_name" value="BlahBlah"/>
</insert>
</changeSet>

这里<column name="create_date" value ="1328055111692"/>工作正常,它会插入到数据库中。我还尝试使用<defaultValueDate><valueDate>,但他们还需要以指定格式输入日期。

我正在寻找像 currentDateTimeFunction 这样的函数,它将根据我正在使用的数据库类型转换为UNIX_TIMESTAMP()或SYSDATE或now()。请帮帮我。

谢谢你, 拉姆亚

7 个答案:

答案 0 :(得分:51)

您需要做的是使用changelog parameter和 定义每个数据库类型替换的“now”或“current_timestamp”参数。

<databaseChangeLog>的顶部,通常在<changeset>之外,添加属性的每个数据库定义,如:

  <property name="now" value="sysdate" dbms="oracle"/>
  <property name="now" value="now()" dbms="mysql"/>
  <property name="now" value="now()" dbms="postgresql"/>

然后在你的变更集中使用

<column name="Join_date" defaultValueFunction="${now}"/>

注意使用defaultValueFunction让liquibase知道 不要将其解析为日期或引用它。

答案 1 :(得分:14)

感谢您的回复。这很有帮助。以下是我所做的,它对我有用。

<property name="now" value="UNIX_TIMESTAMP()" dbms="mysql"/>
<changeSet id="emp_1" author="Me">
<insert tableName="Emp" schemaName="XYZ">
    <column name="EmpName" value="abc"/>
    <column name="Join_date" valueDate="${now}"/>
    <column name="Profile_last_update" valueDate="${now}"/>
    <column name="group_name" value="BlahBlah"/>
</insert>
</changeSet>

再次感谢, 拉姆亚

答案 2 :(得分:4)

如果您使用的是DB2,那么您可以执行以下操作:

<changeSet id="emp_1" author="Me">
<insert tableName="Emp" schemaName="XYZ">
    <column name="EmpName" value="abc"/>
    <column name="Join_date" valueDate="CURRENT TIMESTAMP"/>
    <column name="Profile_last_update" valueDate="CURRENT TIMESTAMP"/>
    <column name="group_name" value="BlahBlah"/>
</insert>
</changeset>

未引用生成的SQL,因此它只调用DB2函数。

答案 3 :(得分:1)

有一种简单的方法,如下所示:

你可以简单地为MySQL使用valueDate =“now()”。就像我的情况一样:

    <changeSet id="emp_1" author="Me">
       <insert tableName="Emp" schemaName="XYZ">
         <column name="last_updated_at" valueDate="now()"></column>
       </insert>
    </changeset>

答案 4 :(得分:1)

Liquibase + Oracle: 使用valueComputed =“ SYSDATE”

使用Oracle 11g:

    <insert tableName="SOMETABLE">
        <column name="ID" valueComputed="SOMETABLE_SEQ.NEXTVAL" />
        <column name="USER_ID" value="123" />
        <column name="CREATED_DATE" valueComputed="SYSDATE" />      
    </insert>

答案 5 :(得分:0)

Ramya和Adam D发布的答案也适用于PostgreSQL。

使用“property”标签,我不得不将dbms更改为dbms="postgresql"并将PostgreSQL函数用于“value”(在我的情况下为CURRENT_TIMESTAMP)。

如果没有“property”标记,我在“column”标记中使用了valueDate="CURRENT_TIMESTAMP"

我正在使用PostgreSQL 9.1.9和Liquibase 2.0.5。

答案 6 :(得分:0)

您可以使用valueNumeric来执行函数,因为它会阻止在值周围包装引号。

<column name="id" valueNumeric="uuid_generate_v4()"></column>