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