web-dev-qa-db-fra.com

liquibase <insert>: Insérer la date du jour

J'essaie d'insérer des données à l'aide d'une balise d'insertion Liquibase. Cela fonctionne bien lorsque je saisis un nombre dans la balise value . Mais je recherche une fonction simple qui prend en charge la date par défaut (date/heure actuelle de la base de données), même lorsque je ne l’ai pas dans mon tableau. définition. 

Par exemple:

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

ici, <column name="create_date" value ="1328055111692"/> fonctionne bien et il est inséré dans la base de données. J'ai aussi essayé d'utiliser <defaultValueDate> et <valueDate>, mais ils ont également besoin d'une entrée de date au format spécifié.

Je cherche une fonction telle que currentDateTimeFunction qui serait convertie en UNIX_TIMESTAMP () ou SYSDATE ou now () en fonction du type de base de données que j'utilise. Aidez-moi, s'il vous plaît.

Merci, Ramya

29
Ramya

Ce que vous devez faire est d’utiliser le paramètre changelog s et Définir un paramètre "now" ou "current_timestamp" remplacé par type de base de données.

En haut de votre <databaseChangeLog>, normalement juste en dehors de votre <changeset>, ajoutez des définitions par base de données de la propriété, telles que:

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

puis dans vos changesets utiliser

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

Notez l’utilisation de defaultValueFunction qui permettra à liquibase de savoir Ne pas l’analyser comme une date ni la citer.

51
Nathan Voxland

Merci pour votre réponse. c'était utile. Voici ce que j'ai fait et cela a fonctionné pour moi.

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

Merci encore, Ramya

14
Ramya

Si vous utilisez DB2, vous pouvez procéder comme suit:

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

Le SQL résultant n'est pas cité, il appelle donc simplement la fonction DB2.

4
Adam D

Il existe un moyen simple de le faire, comme indiqué ci-dessous

vous pouvez simplement utiliser valueDate = "now ()" pour MySQL. Comme dans mon cas je l'ai fait:

    <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: use valueComputed = "SYSDATE"

Travaillé avec 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

Vous pouvez utiliser valueNumeric pour exécuter des fonctions, car cela empêchera la mise entre guillemets de la valeur.

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

Les réponses postées par Ramya et Adam D fonctionnent également pour PostgreSQL.

En utilisant la balise "property", j'ai dû changer le dbms en dbms="postgresql" et utiliser une fonction PostgreSQL pour "value" (CURRENT_TIMESTAMP dans mon cas).

Sans la balise "property", j'ai utilisé valueDate="CURRENT_TIMESTAMP" dans la balise "column".

J'utilise PostgreSQL 9.1.9 et Liquibase 2.0.5.

0
raafaar