【发布时间】:2018-12-22 10:21:41
【问题描述】:
我正在用 Flask 实现一个安静的 POST API,使用 sqlalchemy 来更新 PostgreSQL 中的资源,比如 MyResource:
class MyResource(db.Model):
__tablename__ = 'my_resource'
res_id = Column(Integer, primary_key=True)
<other columns>
time_updated = Column(TIMESTAMP(timezone=True), onupdate=datetime.now(timezone.utc))
有一个从 API 的请求负载派生的MyResource 实例,我们称之为input_instance。以下是我更新资源的方法:
input_instance_dict = input_instance.__dict__
input_instance_dict.pop('_sa_instance_state', None) # this extra meta field will cause error in update().
update_count = MyResource.query.filter(MyResource.res_id == input_instance.res_id).update(input_instance_dict)
db.session.commit()
通过上面的方法,除了time_updated 之外的列都被更新,它保持为空;我希望它会根据当前日期时间进行更新。
如果我在调用 Query.update() 之前从输入中删除 time_updated 字段,
input_instance_dict.pop('time_updated', None)
那么time_updated 列中的空值将使用当前日期时间进行更新,但是……在后续更新中,该列的值保持不变。
我的疑问是,即使从输入字典中删除了 time_updated 字段,onupdate 也只会在第一次更新时生效,但之后不会生效。为什么?谢谢。
--- 更新 12/23 上午 10:56 GMT+8
补充观察,我刚刚重新触发了与昨晚两次相同的更新,time_updated 列正在为第一次重试而更新,但不是第二次。这意味着,在第一次更新之后,onupdate 会在后续更新中开启和关闭。我无法弄清楚模式,什么时候可以工作,什么时候不可以。
【问题讨论】:
-
我不确定这是否会有所帮助,但请尝试将
synchronize_session=False作为参数添加到您的更新中。 -
@SamHollenbach 我刚刚尝试了您的建议,结果相同。我也为此参数尝试了“获取”,但结果是一样的。谢谢。
标签: python postgresql sqlalchemy flask-sqlalchemy