Rõ ràng vấn đề không liên quan đến SqlAlchemy mà là với MySQL engine bên dưới. Hành vi mặc định là đặt on update CURRENT_TIMESTAMP
trên cột TIMESTAMP đầu tiên trong bảng.
Hành vi này được mô tả tại đây
. Theo như tôi hiểu, một giải pháp khả thi là khởi động MySQL với --explicit_defaults_for_timestamp=FALSE
lá cờ. Một giải pháp khác có thể được tìm thấy tại đây
. Tôi vẫn chưa thử một trong hai giải pháp, tôi sẽ cập nhật câu trả lời này ngay khi tôi giải quyết được vấn đề.
CHỈNH SỬA:Tôi đã thử phương pháp thứ hai và nó không tiện dụng lắm nhưng nó hoạt động. Trong trường hợp của tôi, tôi đã tạo một tập hợp các bảng không có created_at
và sau đó tôi đã thay đổi tất cả các bảng còn lại như được mô tả trong liên kết ở trên.
Vài nét về:
_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:một cách khác (dễ dàng hơn) để thực hiện điều này là đặt trong SqlAlchemy một server_default
giá trị cho cột:
created_at = Column(TIMESTAMP, default=datetime.utcnow, nullable=False, server_default=text('0'))