sqlalchemy:获取批量删除影响的行数
我需要获取所有受到批量删除影响的行,像这样:
Session.query(SomeClass).filter_by(foo='bar').delete()
我发现可以订阅批量删除事件,但是我不知道怎么利用这个事件来获取我需要的信息。
3 个回答
3
如果你想知道在SQLAlchemy 2.0的写法中,怎么获取被delete
语句(还有update
语句)影响的行数,下面就是方法:
st = delete(Model).where(Model.some_field == some_value)
res = session.execute(st)
session.commit()
print(f"Rows affected: {res.rowcount}")
7
来自
https://docs.sqlalchemy.org/en/latest/orm/query.html#sqlalchemy.orm.query.Query.delete
执行一个批量删除的查询。
从数据库中删除与这个查询匹配的行。
返回:数据库的“行数统计”功能返回的匹配行数。
5
好的,找到答案了 \☺/ 你可以重新执行之前用来选择要批量删除的行的查询语句。遗憾的是,你不能直接查询ORM对象,但你可以得到一个包含所有被删除行的旧列值的列表,这些值会以元组的形式呈现:
def after_bulk_delete(session, query, query_context, result):
affected_table = query_context.statement.froms[0]
affected_rows = query_context.statement.execute().fetchall()
sqlalchemy.event.listen(Session, "after_bulk_delete", after_bulk_delete)