Очевидно проблемът не е свързан със SqlAlchemy, а с основния MySQL двигател. Поведението по подразбиране е да се зададе on update CURRENT_TIMESTAMP
в първата колона TIMESTAMP в таблица.
Това поведение е описано тук
. Доколкото разбирам, възможно решение е да стартирате MySQL с --explicit_defaults_for_timestamp=FALSE
знаме. Друго решение може да се намери тук
. Все още не съм пробвал нито едно от решенията, ще актуализирам този отговор веднага щом разреша проблема.
РЕДАКТИРАНЕ:Опитах втория метод и не е много удобен, но работи. В моя случай създадох набор от таблици, които нямат 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'))