36

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

例如:

<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() 。请帮我。

谢谢你,拉姆亚

4

8 回答 8

62

您需要做的是使用changelog 参数s 并定义每个数据库类型替换的“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 知道不要将其解析为日期或引用它。

于 2012-02-01T07:11:38.253 回答
18

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

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

再次感谢,拉姆亚

于 2012-02-01T17:29:56.930 回答
5

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

于 2012-02-23T10:06:15.657 回答
2

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

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

    <changeSet id="emp_1" author="Me">
       <insert tableName="Emp" schemaName="XYZ">
         <column name="last_updated_at" valueDate="now()"></column>
       </insert>
    </changeset>
于 2014-02-20T05:59:17.317 回答
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>
于 2018-08-14T15:09:06.210 回答
0

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

<column name="id" valueNumeric="uuid_generate_v4()"></column>
于 2014-02-06T14:46:36.837 回答
0

The answers posted by Ramya and Adam D, works for PostgreSQL too.

Using the "property" tag, I had to change the dbms to dbms="postgresql" and to use a PostgreSQL function for "value" (CURRENT_TIMESTAMP in my case).

Without the "property" tag, I used valueDate="CURRENT_TIMESTAMP" in the "column" tag.

I'm using PostgreSQL 9.1.9 and Liquibase 2.0.5.

于 2014-01-17T22:04:12.550 回答
0

首先,您必须在插入标签中设置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>
于 2021-09-22T07:40:36.920 回答