首页 > 解决方案 > SQLAlchemy 日期字段未使用 server_onupdate 更新

问题描述

将 SQLAlchemy 与 flask_sqlalchemy 和用于 PostgreSQL 的 alembic 一起使用。我对字段有以下定义:

date_updated = db.Column(db.DateTime, server_default=db.func.now(), server_onupdate=db.func.now())

但是,当记录被修改时,该字段永远不会更新。它设置在创建并且从不更新。这是 alembic 生成的用于创建表的内容:

sa.Column('date_updated', sa.DateTime(), server_default=sa.text('now()'), nullable=True),

所以难怪它没有被更新,因为 server_onupdate 参数似乎没有超过alembic。

我不确定这样做的正确方法。SQLAlchemy 文档令人沮丧地复杂并且不清楚这涉及到什么地方。

编辑:从直接在 PostgreSQL 中查看如何执行此操作,看起来它需要使用触发器。如果可能的话,我宁愿在数据库级别而不是在应用程序级别执行此操作,但我不知道是否可以通过 SQLAlchemy 添加触发器。我可以直接在数据库中添加它,但是在应用迁移时可能会中断。

标签: sqlalchemyalembic

解决方案


你说“我不确定这样做的正确方法”的方式,我不确定你是指专门更新服务器端的日期,还是只是一般地更新它。

如果您只想更新它并且无论如何都没有关系,我认为最干净的方法是使用事件侦听器。

这是一个使用 normal 的示例sqlalchemy,它可能是相同的(或至少非常相似)flask-sqlalchemy

from datetime import datetime
from sqlalchemy import event

@event.listens_for(YourModel, 'before_insert')
@event.listens_for(YourModel, 'before_update')
def date_insert(mapper, connection, target):
    target.date_updated = datetime.utcnow()

推荐阅读