sql >> Base de Datos >  >> RDS >> Mysql

SqlAlchemy TIMESTAMP 'en actualización' extra

Aparentemente, el problema no está relacionado con SqlAlchemy sino con el motor MySQL subyacente. El comportamiento predeterminado es establecer on update CURRENT_TIMESTAMP en la primera columna TIMESTAMP de una tabla.

Este comportamiento se describe aquí . Según tengo entendido, una posible solución es iniciar MySQL con --explicit_defaults_for_timestamp=FALSE bandera. Se puede encontrar otra solución aquí . Todavía no he probado ninguna solución, actualizaré esta respuesta tan pronto como resuelva el problema.

EDITAR:Probé el segundo método y no es muy útil pero funciona. En mi caso, creé un conjunto de tablas que no tienen un created_at atributo y luego modifiqué todas las tablas restantes como se describe en el enlace anterior.

Algo como:

_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:otra forma (más fácil) de lograr esto es establecer en SqlAlchemy un server_default valor para la columna:

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