Problém zjevně nesouvisí se SqlAlchemy, ale se základním enginem MySQL. Výchozí chování je nastavit on update CURRENT_TIMESTAMP
v prvním sloupci TIMESTAMP v tabulce.
Toto chování je popsáno zde
. Pokud jsem pochopil, možným řešením je spustit MySQL s --explicit_defaults_for_timestamp=FALSE
vlajka. Jiné řešení lze nalézt zde
. Zatím jsem nezkoušel ani jedno řešení, tuto odpověď aktualizuji, jakmile problém vyřeším.
EDIT:Zkoušel jsem druhý způsob a není to moc praktické, ale funguje to. V mém případě jsem vytvořil sadu tabulek, které nemají created_at
a poté jsem upravil všechny zbývající tabulky, jak je popsáno v odkazu výše.
Něco ve smyslu:
_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:další (snazší) způsob, jak toho dosáhnout, je nastavení v SqlAlchemy server_default
hodnota pro sloupec:
created_at = Column(TIMESTAMP, default=datetime.utcnow, nullable=False, server_default=text('0'))