Mysql
 sql >> Base de données >  >> RDS >> Mysql

SqlAlchemy TIMESTAMP 'sur la mise à jour' supplémentaire

Apparemment, le problème n'est pas lié à SqlAlchemy mais au moteur MySQL sous-jacent. Le comportement par défaut est de définir on update CURRENT_TIMESTAMP sur la première colonne TIMESTAMP d'une table.

Ce comportement est décrit ici . Autant que je sache, une solution possible consiste à démarrer MySQL avec le --explicit_defaults_for_timestamp=FALSE drapeau. Une autre solution peut être trouvée ici . Je n'ai pas encore essayé l'une ou l'autre des solutions, je mettrai à jour cette réponse dès que j'aurai résolu le problème.

EDIT :j'ai essayé la deuxième méthode et ce n'est pas très pratique mais ça marche. Dans mon cas, j'ai créé un ensemble de tables qui n'ont pas de created_at attribut puis j'ai modifié toutes les tables restantes comme décrit dans le lien ci-dessus.

Quelque chose comme :

_no_alter = set(['tables', 'which', 'do not', 'have', 'a created_at', 'column'])
Base.metadata.create_all(engine)
for table in Base.metadata.tables.keys():
    if table not in _no_alter:
      engine.execute(text('ALTER TABLE {} MODIFY created_at TIMESTAMP NOT NULL DEFAULT 0'.format(table)))

EDIT2 :un autre moyen (plus simple) d'y parvenir consiste à définir dans SqlAlchemy un server_default valeur pour la colonne :

created_at = Column(TIMESTAMP, default=datetime.utcnow, nullable=False, server_default=text('0'))