Blijkbaar is het probleem niet gerelateerd aan SqlAlchemy maar aan de onderliggende MySQL-engine. Het standaardgedrag is om on update CURRENT_TIMESTAMP
op de eerste TIMESTAMP-kolom in een tabel.
Dit gedrag wordt hier
beschreven . Voor zover ik begrijp, is een mogelijke oplossing om MySQL te starten met de --explicit_defaults_for_timestamp=FALSE
vlag. Een andere oplossing vindt u hier
. Ik heb geen van beide oplossingen geprobeerd, ik zal dit antwoord bijwerken zodra ik het probleem heb opgelost.
EDIT:Ik heb de tweede methode geprobeerd en het is niet erg handig, maar het werkt. In mijn geval heb ik een set tabellen gemaakt die geen created_at
. hebben attribuut en dan heb ik alle overige tabellen gewijzigd zoals beschreven in de link hierboven.
Iets in de trant van:
_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:een andere (gemakkelijkere) manier om dit te bereiken is door in SqlAlchemy een server_default
in te stellen waarde voor de kolom:
created_at = Column(TIMESTAMP, default=datetime.utcnow, nullable=False, server_default=text('0'))