События after_insert
и after_update
предназначены для запуска дополнительных действий, когда сеанс сбрасывает временные объекты в базу данных.На этом этапе данные передаются в направлении one из Python в базу данных.Любые триггеры на стороне базы данных, такие как ваши значения по умолчанию, не видны на этом этапе, если только сервер явно не поддерживает возврат таких данных и вы не настроили SQLAlchemy для их получения в это время.
На всякий случай, если это не ясноfunc.now()
- это правописание SQLAlchemy для функции NOW()
в SQL, функция выполняется, когда база данных выполняет операторы INSERT
или UPDATE
, поэтому значение существует только на стороне базы данных.Это клиентские выражения SQL .
Вместо них следует использовать server_default
и server_onupdate
.Если вы используете базу данных, которая поддерживает функции RETURNING
или OUTPUT inserted
или аналогичные, для возврата значений выражений из вставок или обновлений непосредственно при выполнении (например, PostgreSQL, Oracle и SQL Server), то такие значения будут доступны для SQL-Алхимия немедленно.Для MySQL или SQLLite или других баз данных без поддержки RETURNING
вы вынуждены обновить объект. См. Выборка сгенерированных сервером значений .
Для сервера, который поддерживает RETURNING
Я думаю, что добавления eager_defaults
должно быть достаточно:
class SomeModel(Base):
updated_at = db.Column(
db.DateTime,
server_default=db.func.now(),
server_onupdate=db.func.now()
)
__mapper_args__ = {"eager_defaults": True}
(Строка server_onupdate
действительно означает, что SQLAlchemy будет знать, что нужно искать обновленное значение, и, вероятно, для работы требуется определение дополнительного триггераСм. эту проблему, где server_onupdate
используется с MySQL ).
Даже если база данных не поддерживает RETURNING
, использование eager_defaults
должно работать, поскольку это автоматически добавитдополнительный SELECT
к запросу. Это действительно стоит вам с точки зрения производительности .Попробуйте вместо этого использовать вызываемые Python для значений по умолчанию (и воздержитесь от того, чтобы база данных позаботилась об этих значениях).