web-dev-qa-db-ja.com

liquibase <挿入>:現在の日付を挿入

Liquibase insertタグを使用してデータを挿入しようとしています。値タグに数値を入力しているときは正常に動作します。しかし、テーブル定義の一部として持っていなくても、デフォルトの日付(データベースの現在の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()に変換されます。私を助けてください。

ありがとう、ラミーヤ

29
Ramya

あなたがしなければならないことは、 changelog parameter 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は、日付として解析したり、引用したりしないようになります。

51
Nathan Voxland

お返事ありがとうございます。役に立ちました。以下は私がやったことであり、私のために働いた。

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

ありがとう、ラミーヤ

14
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関数を呼び出すだけです。

5
Adam D

以下のようにそれを行う簡単な方法があります

mySQLにはvalueDate = "now()"を使用するだけです。私の場合のように:

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

Liquibase + Oracle:se 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>
1
Witold Kaczurba

ValueNumericを使用して関数を実行できます。これにより、値を引用符で囲むことができなくなります。

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

RamyaとAdam Dが投稿した回答は、PostgreSQLでも機能します。

「property」タグを使用して、dbmsをdbms="postgresql"に変更し、 "value"(私の場合はCURRENT_TIMESTAMP)にPostgreSQL関数を使用する必要がありました。

「property」タグなしで、「column」タグでvalueDate="CURRENT_TIMESTAMP"を使用しました。

PostgreSQL 9.1.9とLiquibase 2.0.5を使用しています。

0
raafaar