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

67

我有一张拥有数百万行的表格。我想通过in子句删除多行数据。但是,使用以下代码:

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

上述代码将查询结果,然后执行删除操作。我不想这样做。我想要速度。

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

所以问题是:如何在使用ORM的情况下兼顾两全?我可以在不硬编码查询的情况下执行删除吗?

4个回答

76

没错!你可以在带有关联where子句的表对象上调用delete()函数。

就像这样:

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

(然后不要忘记执行语句:engine.execute(stmt)

来源


5
问题不是问如何使用ORM吗?这里使用了SQAlchemy Core语法。我想只是提供一个FYI(供参考)。 - c8999c 3f964f64

48

为了补充dizzy的回答:

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

30

如果开发者不想执行基本查询,下面的解决方案也可以工作。

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

2
synchronize_session=False 是用来做什么的? - Nam G VU
2
@NamGVU 这是来自文档的解释:False - 不同步会话。这个选项是最有效的,一旦会话过期,通常发生在commit()之后,或者显式地使用expire_all()。在过期之前,在数据库中更新或删除的对象仍可能以陈旧的值留存在会话中,这可能导致混乱的结果。https://docs.sqlalchemy.org/en/14/orm/session_basics.html#selecting-a-synchronization-strategy - Ojus sangoi

16

AttributeError: 'AsyncSession' object has no attribute 'exec' - Mohammad Etemaddar
3
@MohammadEtemaddar 你可能需要使用 .execute 方法而不是 exec - Angel
我可以确认需要使用.execute而不是.exec - tdg5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接