【问题标题】: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()

PHP + MySQL 示例:

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

【问题讨论】:

  • 嗯,queryset.delete() 应该删除 len(queryset) 的对象数量,但是要从 MySQL 中获取受影响的行数,我认为应该直接使用 MySQLdb 驱动程序。

标签: django django-models mysql django-orm


【解决方案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 模式下工作一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多