gpt4 book ai didi

python - 用 sqlalchemy 覆盖 postgresql onupdate

转载 作者:行者123 更新时间:2023-11-29 12:07:11 26 4
gpt4 key购买 nike

原始问题我正在使用 sqlalchemy在我们的项目中。我像这样为我的模型注册了几个事件监听器。

@event.listens_for(Post, 'after_update')
@event.listens_for(Post, 'after_insert')

我在代码的其他地方更新了模型的 view_counter 属性。

post.view_counter += 1
DBSession.flush()

现在,由于 view_counter 不是我认为的内容更新,我想在 sqlalchemy 中针对此特定更新抑制 after_update 事件的触发。有没有办法通过 ORM 来完成,或者是完全绕过 ORM 进行原始 SQL 更新的唯一方法?

编辑经过一番摸索,我意识到还有另一个问题,该属性是由 Postgresql 本身设置的

date_last_updated = Column(SA_DateTime, default=DateTime.now, onupdate=DateTime.now, nullable=False, index=True)

问题
所以问题是,如何在不触发 Postgresql 更新的情况下更新 sqlalchemy 模型。

最佳答案

如果您能够对装饰函数进行更改,应该可以使用 passed arguments确定哪些字段被修改,尽管通过一点点 a workaround .恐怕我还不能测试这个,但我希望它能有所帮助!

@event.listens_for(Post, 'after_update', raw=True)
@event.listens_for(Post, 'after_insert', raw=True)
def myfunc(mapper, connection, target):
# Values have been modified
if target.session.is_modified(target, include_collections=False):
# view_counter is the only modified value, the hook can be aborted
if set(target.dict.keys()) - target.unmodified == {'view_counter'}:
return
<...the rest of the function...>

关于python - 用 sqlalchemy 覆盖 postgresql onupdate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57222721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com