SQLAlchemy:如何在不查询的情况下删除多行

sup*_*oba 25 python orm sqlalchemy

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

session.query(Users).filter(Users.id.in_(subquery....)).delete()
Run Code Online (Sandbox Code Playgroud)

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

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

所以问题:如何使用ORM获得两个世界中最好的?我可以在没有硬编码查询的情况下进行删除吗?

diz*_*zyf 34

是的!您可以delete()使用关联的whereclause 调用表对象.

像这样的东西:

engine.execute(stmt)

(然后不要忘记执行语句:delete())

资源

  • 问题不是问使用ORM吗?这使用 SQAlchemy Core 语法。我想仅供参考。 (3认同)

Áng*_*gel 18

新语法(1.4版本及以上)

from sqlalchemy import delete

statement = delete(User).where(User.id.in_(...))
session.execute(statement)
Run Code Online (Sandbox Code Playgroud)

https://docs.sqlalchemy.org/en/14/core/dml.html?highlight=delete


Oju*_*goi 14

如果开发人员不想执行普通的普通查询,以下解决方案也有效。

session.query(Users).filter(Users.id.in_(subquery....)).delete(synchronize_session=False)
Run Code Online (Sandbox Code Playgroud)

  • `synchronize_session=False` 是做什么用的? (2认同)
  • @NamGVU 这是文档中的解释:False - 不同步会话。一旦会话过期(通常发生在 commit() 或显式使用 expire_all() 之后),此选项是最有效且可靠的。在过期之前,数据库中更新或删除的对象可能仍保留在会话中,且其值已过时,这可能会导致结果混乱。https://docs.sqlalchemy.org/en/14/orm/session_basics.html#selecting-a-synchronization-strategy (2认同)

小智 11

要完成头晕的答案:

delete_q = Report.__table__.delete().where(Report.data == 'test')
db.session.execute(delete_q)
db.session.commit()
Run Code Online (Sandbox Code Playgroud)