Mysql
 sql >> Database >  >> RDS >> Mysql

SqlAlchemy TIMESTAMP 'su aggiornamento' extra

Apparentemente il problema non è correlato a SqlAlchemy ma al motore MySQL sottostante. Il comportamento predefinito è impostare on update CURRENT_TIMESTAMP sulla prima colonna TIMESTAMP di una tabella.

Questo comportamento è descritto qui . Per quanto ho capito, una possibile soluzione è avviare MySQL con --explicit_defaults_for_timestamp=FALSE bandiera. Un'altra soluzione può essere trovata qui . Non ho ancora provato nessuna delle due soluzioni, aggiornerò questa risposta non appena risolverò il problema.

EDIT:ho provato il secondo metodo e non è molto utile ma funziona. Nel mio caso ho creato un insieme di tabelle che non hanno un created_at attributo e quindi ho modificato tutte le tabelle rimanenti come descritto nel link sopra.

Qualcosa sulla falsariga di:

_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 altro modo (più semplice) per farlo è impostare in SqlAlchemy un server_default valore per la colonna:

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