Liquibase: comment définir la valeur par défaut d'une colonne date pour qu'elle soit "maintenant" au format UTC?
Comment définissez-vous la valeur par défaut d'une colonne date pour être "maintenant" au format UTC? Je pense que la réponse implique l' defaultValueComputed
attribut Élément de colonne.
La documentation:
defaultValueComputed Une valeur qui est renvoyée par une fonction ou appel de procédure. Cet attribut contient la fonction à appeler.
dans quelle langue la fonction mentionnée est-elle censée être écrite? Java? Est le la fonction est censée être la fonction date propre au vendeur de la base de données que je veux utiliser? Y a-t-il d'autres documents que je peux lire sur ce sujet?
6 réponses
Peut-être 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 serait CURRENT_TIMESTAMP
donc il pourrait ressembler à ceci:
<createTable tableName="D_UserSession">
<column name="ts" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP"/>
</createTable>
(Copié à partir du post sur le forum.)
cela fonctionne avec SQlite:
<column name="last_updated_at" type="TIMESTAMP" defaultValueComputed="CURRENT_TIMESTAMP">
<constraints nullable="false"/>
</column>
ajouter '$ now ' n'a pas fonctionné pour moi. J'utilise SQlite comme base de données.
Dans MySQL, pour utiliser une colonne DATETIME avec des fractions de seconde comme DATETIME(6)
(précision microsecondes), utilisez la valeur par défaut de NOW(6)
(attention: CURRENT_TIMESTAMP(6)
pour une raison quelconque produit une erreur avec moi à l'aide de 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 dans UTC, mais lue en utilisant les paramètres du fuseau horaire du serveur (@@global.time_zone
,@@session.time_zone
).
Cela a fonctionné pour moi:
<column name="ts" type="timestamp" valueDate="${now}"/>
je l'ai trouvé grâce à cette réponse: https://stackoverflow.com/a/9100388/3107952
comme liquibase est un changelog courant pour n'importe quelle base de données, pour la rendre Générique, vous ne devriez pas dépendre d'une base de données spécifique comme oracle, postèges, mysql à la place, il devrait être assez générique pour fonctionner pour n'importe quelle/chaque base de données.
ci-Dessous est la façon dont il devrait être mis en œuvre :
<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 comme DATA_DEFAULT.
j'ai utilisé la fonction vendeur de base de données. Pour Oracle c'est un sysdate:
<column name="create_date" type="DATETIME" valueDate="sysdate" defaultValueComputed="sysdate" />