【问题标题】:SQLAlchemy: How do you delete multiple rows without queryingSQLAlchemy:如何在不查询的情况下删除多行
【发布时间】:2017-02-07 23:19:24
【问题描述】:

我有一个包含数百万行的表。我想通过 in 子句删除多行。但是,使用代码:

session.query(Users).filter(Users.id.in_(subquery....)).delete()

上面的代码会查询结果,然后执行删除。我不想那样做。我要速度。

我希望能够执行(是的,我知道 session.execute):Delete from users where id in ()

所以问题:如何使用 ORM 获得两全其美的效果?我可以在不对查询进行硬编码的情况下进行删除吗?

【问题讨论】:

    标签: python orm sqlalchemy


    【解决方案1】:

    是的!您可以使用关联的 where 子句对表对象调用 delete()

    类似这样的:

    stmt = Users.__table__.delete().where(Users.id.in_(subquery...))
    

    (然后别忘了执行语句:engine.execute(stmt)

    source

    【讨论】:

    • 这个问题不是问关于使用 ORM 的吗?这使用 SQAlchemy 核心语法。我猜只是仅供参考。
    【解决方案2】:

    完成dizzy的回答:

    delete_q = Report.__table__.delete().where(Report.data == 'test')
    db.session.execute(delete_q)
    db.session.commit()
    

    【讨论】:

      【解决方案3】:

      如果开发人员不想执行普通查询,以下解决方案也可以使用。

      session.query(Users).filter(Users.id.in_(subquery....)).delete(synchronize_session=False)
      

      【讨论】:

      • synchronize_session=False 是干什么用的?
      • @NamGVU 以下是文档中的解释:False - 不同步会话。一旦会话过期,这个选项是最有效的并且是最可靠的,这通常发生在 commit() 之后,或者显式使用 expire_all()。在过期之前,在数据库中更新或删除的对象可能仍以陈旧值保留在会话中,这可能导致结果混乱。 docs.sqlalchemy.org/en/14/orm/…
      猜你喜欢
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 2017-06-27
      • 2017-09-08
      • 2018-01-06
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多