Reputation: 988
I have a table that has millions of rows. I want to delete multiple rows via an in clause. However, using the code:
session.query(Users).filter(Users.id.in_(subquery....)).delete()
The above code will query the results, and then execute the delete. I don't want to do that. I want speed.
I want to be able to execute (yes I know about the session.execute):Delete from users where id in ()
So the Question: How can I get the best of two worlds, using the ORM? Can I do the delete without hard coding the query?
Upvotes: 76
Views: 79689
Reputation: 2865
from sqlalchemy import delete
statement = delete(User).where(User.id.in_(...))
session.execute(statement)
https://docs.sqlalchemy.org/en/14/core/dml.html?highlight=delete
Upvotes: 22
Reputation: 716
The below solution also works, if developers do not want to execute a plain vanilla query.
session.query(Users).filter(Users.id.in_(subquery....)).delete(synchronize_session=False)
Upvotes: 32
Reputation: 3593
Yep! You can call delete()
on the table object with an associated where clause.
Something like this:
stmt = Users.__table__.delete().where(Users.id.in_(subquery...))
(and then don't forget to execute the statement: engine.execute(stmt)
)
Upvotes: 82