删除了多少行?
Posted
技术标签:
【中文标题】删除了多少行?【英文标题】:How many rows were deleted? 【发布时间】:2011-03-21 12:30:22 【问题描述】:是否可以检查查询
queryset = MyModel.object.filter(foo=bar)
queryset.delete()
deleted = ...
或者我应该为此使用交易吗?
@transaction.commit_on_success
def delete_some_rows():
queryset = MyModel.object.filter(foo=bar)
deleted = queryset.count()
queryset.delete()
mysql_query('DELETE FROM mytable WHERE id < 10');
printf("Records deleted: %d\n", mysql_affected_rows());
【问题讨论】:
嗯,queryset.delete()
应该删除 len(queryset)
的对象数量,但是要从 MySQL 中获取受影响的行数,我认为应该直接使用 MySQLdb 驱动程序。
【参考方案1】:
在很多情况下,您都想知道删除了多少行,例如,如果您根据删除的行数来做某事。通过执行 COUNT 来检查它会产生额外的数据库负载并且不是原子的。
queryset.delete()
方法立即删除对象并返回已删除对象的数量和包含每个对象类型的删除数量的字典。
查看文档了解更多详情:https://docs.djangoproject.com/en/stable/topics/db/queries/#deleting-objects
【讨论】:
【参考方案2】:您可以使用SELECT row_count()
查看受影响的实际行。
首先qs.count()
和cursor.rowcount
不是一回事!
在带有可重复读取(默认模式)的 InnoDB 的 MySQL 中,读取查询和写入查询查看 !!DIFFERENT!!! 查询集!
READ 查询从旧快照读取,而 WRITE 查询查看实际提交的数据,就像它们在 READ COMMITTED
模式下工作一样。
【讨论】:
以上是关于删除了多少行?的主要内容,如果未能解决你的问题,请参考以下文章