【问题标题】:How to issue an update in Sqlalchemy in a single query?如何在单个查询中在 Sqlalchemy 中发布更新?
【发布时间】:2021-10-18 06:00:24
【问题描述】:

我想使用 Sqlalchemy ORM 来发出更新语句,但从我所看过的所有地方(official docstutorials point、其他 stackoverflow 答案)这需要:

  • 执行查询以检索对象
  • 对检索到的对象进行更改
  • 发出提交/刷新

假设我们已经有一个会话对象和一个 Dummy 模型,这会产生如下结果:

dummy = session.query(Dummy).filter(Dummy.id == 1).first()
dummy.name = "dumb-dumb"
session.commit()

这不会导致对数据库的两次调用吗?如果是这样,我可以执行以下操作以将其减少为单个调用:

session.query(Dummy).filter(Dummy.id == 1).update({"name": "dumb-dumb"})
session.commit()

第二个代码块会更高效,还是没有任何区别?

我考虑过使用 Sqlalchmey 核心,因为我知道如何构造语句,但我还需要在插入或更新后创建一些侦听器,这需要使用 ORM。

提前谢谢你。

【问题讨论】:

    标签: python python-3.x sqlalchemy


    【解决方案1】:

    如文档中所述,您可以使用ORM-enabled UPDATE statements

    session.execute(update(Dummy).where(Dummy.id == 1).values(name="dumb-dumb"))
    

    这不会发出after_update 事件,但您可以为do_orm_execute 添加事件侦听器来监控更改。

    【讨论】:

    • 问题是这不会发出 after_insert / after_update 监听器。我可以使用 Core 的其他侦听器,但对于我的用例 after_insert / after_update 最有意义。
    • 您可以使用do_orm_execute 事件来监控这个启用ORM 的更新语句。
    猜你喜欢
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    相关资源
    最近更新 更多