sqlalchemy:获取批量删除影响的行数

12 投票
3 回答
12379 浏览
提问于 2025-04-17 10:46

我需要获取所有受到批量删除影响的行,像这样:

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)

撰写回答