Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SqlAlchemy TIMESTAMP 'auf Update' extra

Anscheinend hängt das Problem nicht mit SqlAlchemy zusammen, sondern mit der zugrunde liegenden MySQL-Engine. Das Standardverhalten besteht darin, on update CURRENT_TIMESTAMP festzulegen in der ersten TIMESTAMP-Spalte in einer Tabelle.

Dieses Verhalten wird hier beschrieben . Soweit ich weiß, besteht eine mögliche Lösung darin, MySQL mit --explicit_defaults_for_timestamp=FALSE zu starten Flagge. Eine andere Lösung finden Sie hier . Ich habe noch keine Lösung ausprobiert, ich werde diese Antwort aktualisieren, sobald ich das Problem gelöst habe.

BEARBEITEN:Ich habe die zweite Methode ausprobiert und sie ist nicht sehr praktisch, aber sie funktioniert. In meinem Fall habe ich eine Reihe von Tabellen erstellt, die keinen created_at haben -Attribut und dann habe ich alle restlichen Tabellen wie im obigen Link beschrieben geändert.

Etwas in der Art von:

_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:Eine andere (einfachere) Möglichkeit, dies zu erreichen, besteht darin, in SqlAlchemy einen server_default festzulegen Wert für die Spalte:

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