Najwyraźniej problem nie jest związany z SqlAlchemy, ale z bazowym silnikiem MySQL. Domyślnym zachowaniem jest ustawienie on update CURRENT_TIMESTAMP
w pierwszej kolumnie TIMESTAMP w tabeli.
To zachowanie opisano tutaj
. O ile rozumiem, możliwym rozwiązaniem jest uruchomienie MySQL z --explicit_defaults_for_timestamp=FALSE
flaga. Inne rozwiązanie znajdziesz tutaj
. Nie wypróbowałem jeszcze żadnego rozwiązania, zaktualizuję tę odpowiedź, gdy tylko rozwiążę problem.
EDYCJA:Wypróbowałem drugą metodę i nie jest ona zbyt poręczna, ale działa. W moim przypadku stworzyłem zestaw tabel, które nie mają created_at
atrybut, a następnie zmieniłem wszystkie pozostałe tabele zgodnie z opisem w powyższym linku.
Coś w stylu:
_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:innym (łatwiejszym) sposobem osiągnięcia tego jest ustawienie w SqlAlchemy server_default
wartość kolumny:
created_at = Column(TIMESTAMP, default=datetime.utcnow, nullable=False, server_default=text('0'))