Как получить данные в кусках из БД в django, а затем удалить их? - PullRequest
0 голосов
/ 18 марта 2020

Моя основная проблема c заключается в том, что я хочу получить каждую строку, но порциями по 2000 строк одновременно из таблицы, содержащей 1 миллион строк. И после того, как эти фрагментированные запросы оценены, я хочу удалить каждую строку.

, поэтому просто скажите, что у меня есть

a = Model.objects.filter(id=1<2000)
b = Model.objects.filter(id=2000<4000)
c = Model.objects.filter(id=4000<6000)
..
..

сейчас, если я каким-то образом объединю все эти наборы запросов в один набор запросов, скажем

del = a + b + c +d ......

, и я делаю

del.delete()

, поэтому он удалит все строки за меньшее время или будет повторно обрабатывать запросы для удаления их и займет время?

1 Ответ

0 голосов
/ 18 марта 2020

Queryset's ленивый , поэтому это не будет иметь никакого эффекта повышения производительности. Но если вы хотите уменьшить потребление памяти, тогда вы можете использовать (итератор) [https://docs.djangoproject.com/en/3.0/ref/models/querysets/#iterator] с установленным параметром chunk_size:

for record in Model.objects.all().iterator(chunk_size=2000):
    record.delete()

Иначе, если вы действительно ищете улучшая скорость удаления, вы можете попытаться использовать недокументированный метод _raw_delete

a = Model.objects.all()
a._raw_delete(a.db)

только в том случае, если:

  1. ваши модели не имеют каскадного удаления (например, внешние ключи, относящиеся к этой модели с on_delete=CASCADE)
  2. ваша модель не обрабатывает сигналы
...