我有一个有数百万行的表。我想通过in子句删除多行。但是,使用代码:
session.query(Users).filter(Users.id.in_(subquery....)).delete()
上面的代码将查询结果,然后执行删除。我不想这样做。我想要速度。
我希望能够执行(是的,我知道session.execute):Delete from users where id in ()
所以问题:如何使用ORM获得两个世界中最好的?我可以在不对查询进行硬编码的情况下进行删除吗?
答案 0 :(得分:24)
是的!您可以使用关联的whereclause在表对象上调用delete()
。
这样的事情:
stmt = Users.__table__.delete().where(Users.id.in_(subquery...))
(然后不要忘记执行语句:engine.execute(stmt)
)
答案 1 :(得分:4)
要完成dizzy的答案:
delete_q = Report.__table__.delete().where(Report.data == 'test')
db.session.execute(delete_q)
db.session.commit()
答案 2 :(得分:4)
如果开发人员不想执行普通的普通查询,以下解决方案也可以使用。
session.query(Users).filter(Users.id.in_(subquery....)).delete(synchronize_session=False)