Python sqlalchemy:获取受批量删除影响的行
我需要获取受批量删除影响的所有行,如下所示:Python sqlalchemy:获取受批量删除影响的行,python,events,sqlalchemy,Python,Events,Sqlalchemy,我需要获取受批量删除影响的所有行,如下所示: Session.query(SomeClass).filter_by(foo='bar').delete() 我找到了,但不知道如何使用此事件来实际获取所需信息。好的,找到了答案\☺/ 您可以重新执行用于选择要批量删除的行的select语句。不幸的是,您无法查询ORM对象,但您可以获得所有已删除行的列表,其中旧列值为元组: def after_bulk_delete(session, query, query_context, result):
Session.query(SomeClass).filter_by(foo='bar').delete()
我找到了,但不知道如何使用此事件来实际获取所需信息。好的,找到了答案\☺/ 您可以重新执行用于选择要批量删除的行的select语句。不幸的是,您无法查询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)
从
执行批量删除查询
从数据库中删除与此查询匹配的行
Returns:数据库的“行”返回的匹配行数
“计数”功能
您可以从制作一个小的测试用例脚本开始。。比如:什么是背景?你为什么想要那些排?您需要所有行还是只需要
ID
s。此外,如果您的模型具有继承性,则对象SomeClass
可能映射到多个表中的行。@van我只需要知道已删除行的id。这是我编写的用于监视数据库对象生命周期的库。通过基于实例的添加/删除,这很容易,因为您可以为每个对象钩住事件,而在批量删除时,不会创建对象,因此需要不同的方法。关于您认为SomeClass
可能映射到多个表中的行的观点:Query.delete()命令目前不支持对多个表进行批量删除,这使事情变得更简单:)+1感谢您花时间回答您自己的问题,并且非常明确(元组与ORM对象)。你刚刚帮我省去了很多麻烦。你有没有在SQLAlchemy的最新版本中使用这个功能?我无法用1.1.5以这种方式获取行数据。感谢您只获取受影响行的数量,而不是ID。