7

是否可以检查查询删除了多少行?

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()

PHP + MySQL 示例:

mysql_query('DELETE FROM mytable WHERE id < 10');
printf("Records deleted: %d\n", mysql_affected_rows());
4

2 回答 2

4

在许多情况下,您想知道删除了多少行,例如,如果您根据删除的行数来做某事。通过执行 COUNT 来检查它会创建额外的数据库负载并且不是原子的。

queryset.delete()方法立即删除对象并返回已删除对象的数量和包含每个对象类型的删除数量的字典。查看文档以获取更多详细信息:https ://docs.djangoproject.com/en/stable/topics/db/queries/#deleting-objects

于 2016-04-26T17:16:56.073 回答
0

受影响的实际行可以使用SELECT row_count(). 首先qs.count()cursor.rowcount是不一样的东西!

在带有可重复读取(默认模式)的 InnoDB 的 MySQL 中,读取查询和写入查询查看!!DIFFERENT !!!查询集!

READ 查询从旧快照读取,而 WRITE 查询查看实际提交的数据,就像它们在READ COMMITTED模式下工作一样。

于 2016-11-13T15:06:29.273 回答