どうやら、問題はSqlAlchemyに関連しているのではなく、基盤となるMySQLエンジンに関連しているようです。デフォルトの動作では、on update CURRENT_TIMESTAMP
を設定します。 テーブルの最初のTIMESTAMP列にあります。
この動作については、こちら
で説明されています。 。私が理解している限り、考えられる解決策は、--explicit_defaults_for_timestamp=FALSE
でMySQLを起動することです。 国旗。別の解決策は、ここ
にあります。 。どちらの解決策もまだ試していません。問題が解決したらすぐにこの回答を更新します。
編集:私は2番目の方法を試しましたが、あまり便利ではありませんが、機能します。私の場合、created_at
を持たないテーブルのセットを作成しました 属性を入力してから、上記のリンクで説明されているように、残りのすべてのテーブルを変更しました。
次のようなもの:
_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:これを実現する別の(より簡単な)方法は、SqlAlchemyでserver_default
を設定することです。 列の値:
created_at = Column(TIMESTAMP, default=datetime.utcnow, nullable=False, server_default=text('0'))