sql >> Databasteknik >  >> RDS >> Mysql

SqlAlchemy TIMESTAMP "vid uppdatering" extra

Problemet är tydligen inte relaterat till SqlAlchemy utan med den underliggande MySQL-motorn. Standardbeteendet är att ställa in on update CURRENT_TIMESTAMP i den första TIMESTAMP-kolumnen i en tabell.

Detta beteende beskrivs här . Såvitt jag förstår är en möjlig lösning att starta MySQL med --explicit_defaults_for_timestamp=FALSE flagga. En annan lösning finns här . Jag har inte provat någon av lösningarna än, jag kommer att uppdatera det här svaret så snart jag löst problemet.

EDIT:Jag försökte den andra metoden och den är inte särskilt praktisk men den fungerar. I mitt fall skapade jag en uppsättning av tabellerna som inte har en created_at attribut och sedan har jag ändrat alla återstående tabeller enligt beskrivningen i länken ovan.

Något i stil med:

_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:ett annat (enklare) sätt att åstadkomma detta är att ställa in en server_default i SqlAlchemy värde för kolumnen:

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


  1. Återanvänder du SqlCommand?

  2. Hur man förhindrar att UUID-primärnyckeln för nya SQLAlchemy-objekt skapas med samma värde

  3. Oracle SQL Developer 3.1.07 extra mellanslag mellan tecken med hjälp av listagg

  4. Hur man använder Pandas Write_Frame för att exportera resultat till Oracle Database i cx_Oracle