sqlalchemy - 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 添加触发器。我可以直接在数据库中添加它,但是在应用迁移时可能会中断。
解决方案
你说“我不确定这样做的正确方法”的方式,我不确定你是指专门更新服务器端的日期,还是只是一般地更新它。
如果您只想更新它并且无论如何都没有关系,我认为最干净的方法是使用事件侦听器。
这是一个使用 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()
推荐阅读
- wordpress - 将 Wordpress 网站从 localhost 移动到服务器的问题
- c# - Word 互操作书签不存在
- python - 如何在python中指定相对路径
- c# - 在 WPF 中更改 DecimalUpDown 中的值时如何不启用按钮
- android - 新结果 API 错误:requestCode 只能使用低 16 位
- java - 如何使用模型映射器映射修改后的、不匹配目标、源值的映射?
- pine-script - 如何使用 Pinescript 在每个烛台上画一条线?
- octave - Octave中未定义的变量
- python - (已解决)rdflib:ParseException:预期 {SelectQuery | 构造查询 | 描述查询 | AskQuery},找到“s”(在字符 17 处),(行:2,列:17)
- c# - 作为另一个类成员的类始终为空