【问题标题】:sqlalchemy onupdate inconsistent behavior for Query.update()sqlalchemy onupdate Query.update() 的行为不一致
【发布时间】: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


【解决方案1】:

对于要填充default 的另一个时间戳字段也观察到类似的问题,例如...昨天插入了一条记录,但今天插入的所有记录最终具有与昨天的值相同的time_created 值。

time_created = Column(TIMESTAMP(timezone=True), nullable=False, default=datetime.now(timezone.utc))

更改参数后(对于defaultonupdate),用sqlalchemy.func.now() 替换python datetime 函数可以解决奇怪的行为。

time_created = Column(TIMESTAMP(timezone=True), nullable=False, default=func.now())
time_updated = Column(TIMESTAMP(timezone=True), onupdate=func.now())

我不知道为什么行为差异,有很多教程使用 datetime 函数作为参数,我想知道那些程序是否有同样的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 2016-08-16
    相关资源
    最近更新 更多