繁体   English   中英

用 sqlalchemy 覆盖 postgresql onupdate

[英]Overwrite postgresql onupdate with sqlalchemy

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

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

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

post.view_counter += 1
DBSession.flush()

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

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

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

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

如果您能够对装饰函数进行更改,则应该可以使用传递的参数来确定修改了哪些字段,尽管需要一些解决方法 恐怕我还没有能够测试这个,但我希望它有帮助!

@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...>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM