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'))