Rupanya masalahnya tidak terkait dengan SqlAlchemy tetapi dengan mesin MySQL yang mendasarinya. Perilaku default adalah menyetel on update CURRENT_TIMESTAMP
pada kolom TIMESTAMP pertama dalam sebuah tabel.
Perilaku ini dijelaskan di sini
. Sejauh yang saya mengerti, solusi yang mungkin adalah memulai MySQL dengan --explicit_defaults_for_timestamp=FALSE
bendera. Solusi lain dapat ditemukan di sini
. Saya belum mencoba salah satu solusi, saya akan memperbarui jawaban ini segera setelah saya menyelesaikan masalah.
EDIT:Saya mencoba metode kedua dan itu tidak terlalu berguna tetapi berhasil. Dalam kasus saya, saya membuat satu set tabel yang tidak memiliki created_at
atribut dan kemudian saya telah mengubah semua tabel yang tersisa seperti yang dijelaskan pada tautan di atas.
Sesuatu di sepanjang baris:
_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:cara lain (lebih mudah) untuk mencapai ini adalah dengan mengatur di SqlAlchemy a server_default
nilai untuk kolom:
created_at = Column(TIMESTAMP, default=datetime.utcnow, nullable=False, server_default=text('0'))