液基 <insert> : 插入当前日期



我正在尝试使用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()。请帮帮我。

谢谢,Ramya

您将要做的是使用changelog参数和定义一个"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知道不要将其解析为日期或引用它。

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

<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>

再次感谢,Ramya

如果您正在使用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函数。

下面给出了一种简单的方法

您可以简单地对MySQL使用valueDate="now()"。就像我的情况一样:

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

Liquibase+Oracle: 使用值Computed="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>

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

<column name="id" valueNumeric="uuid_generate_v4()"></column>
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。

首先必须在insert标记中设置dbms

对于日期,请使用标记中的valueDate字段。

 <changeSet  author="name"  id="id_1">
    <insert tableName="table_name" dbms="oracle">
        <column  name="id" value="71"/>
        <column  name="description" value="test"/>
        <column  name="start_date" valueDate="2020-01-01"/>
        <column  name="end_date" valueDate="2021-01-01"/>
    </insert>
</changeSet>

下面的解决方案适用于mysql DB。

<column name="LAST_MODIFIED_DATE" valueComputed="CURRENT_TIMESTAMP"/>

Neek的答案很好(尽管我必须使用valueComputed),但是,在代码的其他部分(如单元测试)中进行替换可能会出现问题,因此根据Liquidbase文档,以下方法有效:

<insert tableName="Emp" schemaName="XYZ" dbms="oracle">  
    <column name="profile_last_update" value="sysdate"/>  
</insert>
<insert tableName="Emp" schemaName="XYZ" dbms="postgresql, mysql">  
    <column name="profile_last_update" value="now()"/>  
</insert> 

相关内容

  • 没有找到相关文章

最新更新