删除了多少行?

时间:2010-07-27 09:51:15

标签: django django-models mysql django-orm

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

您可以使用SELECT row_count()查看受影响的实际行。 首先,qs.count()cursor.rowcount不是一回事!

在带有REPEATABLE READ的InnoDB的MySQL中(默认模式)READ查询和WRITE查询查看 !! DIFFERENT !!! querysets!

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

答案 2 :(得分:-1)

我不明白为什么queryset.count()queryset.distinct().count()还不够。