Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SqlAlchemy TIMESTAMP 'na atualização' extra


Aparentemente, o problema não está relacionado ao SqlAlchemy, mas ao mecanismo MySQL subjacente. O comportamento padrão é definir on update CURRENT_TIMESTAMP na primeira coluna TIMESTAMP em uma tabela.

Esse comportamento é descrito aqui . Pelo que entendi, uma possível solução é iniciar o MySQL com o --explicit_defaults_for_timestamp=FALSE bandeira. Outra solução pode ser encontrada aqui . Ainda não tentei nenhuma das soluções, atualizarei esta resposta assim que resolver o problema.

EDIT:Eu tentei o segundo método e não é muito útil, mas funciona. No meu caso eu criei um conjunto de tabelas que não possuem um created_at atributo e, em seguida, alterei todas as tabelas restantes conforme descrito no link acima.

Algo na linha de:
_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:outra maneira (mais fácil) de fazer isso é definindo no SqlAlchemy um server_default valor da coluna:
created_at = Column(TIMESTAMP, default=datetime.utcnow, nullable=False, server_default=text('0'))