Сколько строк было удалено? - PullRequest
7 голосов
/ 27 июля 2010

Можно ли проверить, сколько строк было удалено запросом?

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

Ответы [ 2 ]

4 голосов
/ 26 апреля 2016

Есть много ситуаций, когда вы хотите узнать, сколько строк было удалено, например, если вы делаете что-то на основе количества удаленных строк. Проверка его путем выполнения COUNT создает дополнительную нагрузку на базу данных и не является атомарной.

Метод queryset.delete() немедленно удаляет объект и возвращает количество удаленных объектов, а также словарь с количеством удалений на тип объекта. Проверьте документы для более подробной информации: https://docs.djangoproject.com/en/1.9/topics/db/queries/#deleting-objects

0 голосов
/ 13 ноября 2016

Реальные затронутые строки вы можете просмотреть с помощью SELECT row_count(). Прежде всего qs.count() и cursor.rowcount это не одно и то же!

В MySQL с InnoDB с функцией REPEATABLE READ (режим по умолчанию) запросы READ и WRITE !! DIFFERENT !!! querysets!

Чтение запросов, считанных из старого снимка, в то время как запросы WRITE просматривают фактические зафиксированные данные, как будто они работают в режиме READ COMMITTED.

...