sql >> Databáze >  >> RDS >> Mysql

SqlAlchemy TIMESTAMP „při aktualizaci“ navíc

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


  1. java.lang.OutOfMemoryError:[vyčerpání paměti] při čtení dat ze Sqlite Android

  2. vlastní řazení mysql

  3. Zjištění počtu znaků a čísel v řetězci

  4. Cizí klíč sériového typu - zajistěte, aby byl vždy vyplněn ručně