web-dev-qa-db-fra.com

Liquibase: Comment définir la valeur par défaut d’une colonne de date sur "maintenant" au format UTC?

Comment définissez-vous la valeur par défaut d'une colonne de date sur "maintenant" au format UTC? Je pense que la réponse implique l'attribut defaultValueComputed sur l'élément column .

La documentation indique:

defaultValueComputed Valeur renvoyée par une fonction ou appel de procédure. Cet attribut contiendra la fonction à appeler.

Dans quelle langue la fonction en question est-elle supposée être écrite? Java? La fonction est-elle supposée être la fonction de date spécifique au fournisseur de base de données que je souhaite utiliser? Existe-t-il d'autres documents que je peux lire sur ce sujet?

26
Jeff

Peut-être que ce sujet dans le forum liquibase aidera? 

Je pense que defaultValueComputed prendra une fonction spécifique à la base de données pour exprimer "maintenant". Dans MySQL, il s'agirait de CURRENT_TIMESTAMP et ressemblerait ainsi à ceci: 

<createTable tableName="D_UserSession">
    <column name="ts" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"/>
</createTable>

(Copié de l'article du forum.)

24
Jens

Dans MySQL, pour utiliser une colonne DATETIME avec des fractions de seconde telles que DATETIME(6) (précision en microsecondes), utilisez la valeur par défaut de NOW(6) (attention: CURRENT_TIMESTAMP(6) pour une raison quelconque génère une erreur avec moi avec liquibase 3.5.3):

<column name="created_at" type="DATETIME(6)" defaultValueComputed="NOW(6)" >
   <constraints nullable="false" />
</column>

Notez que la valeur sera stockée en interne au format UTC, mais lue à l'aide des paramètres de fuseau horaire du serveur (@@global.time_zone, @@session.time_zone).

3
Pavel S.

Cela fonctionne avec SQlite:

<column name="last_updated_at" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP">
                <constraints nullable="false"/>
</column>

L'ajout de '$ maintenant' n'a pas fonctionné pour moi. J'utilise SQlite comme base de données.

2
Neha

Cela a fonctionné pour moi:

<property name="now" value="UNIX_TIMESTAMP()" dbms="mysql"/>
<column name="ts" type="timestamp" valueDate="${now}"/>

Je l'ai trouvé grâce à cette réponse: https://stackoverflow.com/a/9100388/3107952

1
Pedro Madrid

Comme liquibase est un journal de modifications commun à toutes les bases de données, vous ne devez pas vous fier à une base de données spécifique telle que Oracle, postegres, mysql, mais elle doit être suffisamment générique pour fonctionner avec chaque base de données.

Voici comment cela devrait être implémenté:

<column name="time" type="${type.datetime}" defaultValueComputed="${column.datetime.defaultValue}"/>

Cela devrait fonctionner pour toutes les bases de données. Pour Oracle, il insère SYSTIMESTAMP en tant que DATA_DEFAULT.

1
Sagar Jani

J'ai utilisé la fonction du fournisseur de base de données. Pour Oracle, il s’agit d’un sysdate :

<column name="create_date" type="DATETIME" valueDate="sysdate" defaultValueComputed="sysdate" />
0
0x5a4d