sql >> Database >  >> RDS >> Mysql

SqlAlchemy TIMESTAMP 'bij update' extra

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


  1. Is het mogelijk om te bestellen op het totaal aantal van meerdere tafels?

  2. Kolomnaam wordt herhaald in zoekopdrachtresultaten

  3. Een logo toevoegen aan een formulierkoptekst in Microsoft Access

  4. MySQL INSERT - SELECT-query nodig voor tabellen met miljoenen records