Вопросы с тегами [bulk-delete]

1

голосов
0

ответ
46

Просмотры

Джанго массового удаления удаляет только сто строк в то время,

У меня есть две модели с один ко многим отношения между ними: класс HomeCarrier (models.Model) short_name = models.CharField (max_length = 32, уникальный = True) класс CarrierZipCoverage (models.Model): zip_code = models.CharField (max_length = 5 ) home_carrier = models.ForeignKey ( 'HomeCarrier', NULL = True, пустой = True) Согласно документации Вы можете также удалять объекты в объеме. Каждый QuerySet имеет метод удаления (), который удаляет все элементы этого QuerySet. Согласно комментариям источника Функция удаления на самом деле 2 запросов - один, чтобы найти соответствующие объекты, и один для удаления. Я удивлён, когда я пытаюсь навалом удалить 27K почтового покрытия кодов перевозчика carrier.carrierzipcoverage_set.all (). Удалить () Я получил один запрос на удалении для каждой сотни строк в базе данных. В то время как я ожидал увидеть только один запрос на удаление в журнале MySQL для всех почтовых кодов покрытия в то время. Вопрос, есть ли способ, чтобы удалить все объекты из базы данных с одного удаления запроса, не прибегая к сырому SQL?
Daniil Mashkin
15

голосов
1

ответ
569

Просмотры

Как массовое удаление записей с помощью временных таблиц в Hibernate?

У меня вопрос. Где же эти методы идут? Dialect.supportsTemporaryTables (); Dialect.generateTemporaryTableName (); Dialect.dropTemporaryTableAfterUse (); Dialect.getDropTemporaryTableString (); Я пытался просмотреть историю GIT для Dialect.java, но не повезло. Я обнаружил, что было создано что-то вроде MultiTableBulkIdStrategy, но я не мог найти ни одного примера того, как использовать его. К точке ... У меня есть унаследованный код (с помощью спящего режима 4.3.11), который делает партию удалить из нескольких таблиц с использованием временной таблицы. В этих таблицах может быть 1000 строк, но также может быть 10 Milion строк. Так просто, чтобы убедиться, что я не убиваю DB с каким-то сумасшедшим удалением создать временную таблицу, где я ставлю (с помощью запроса на выборку с некоторым условием) 1000 идентификаторов сразу, а затем использовать эту временную таблицу для удаления данных из 4-х таблиц. Это' S работает в то время как цикл, пока все данные, основанные на некоторых условиях не удаляется. Сделка поручена после каждого цикла. Для того, чтобы сделать его более сложным, этот код должен работать на вершине: MySQL, MariaDB, Oracle, PostgreSQL SQLServer и h2. Это было сделано с использованием нативного SQL, с указанными выше методами. Но не я не могу найти способ, как реорганизовать его. Моя первая попытка была создать запрос с использованием вложенного выберите так: удалить из таблицы, где идентификатор в (выберите идентификатор из таблицы, где предел УСЛОВИЯ 1000), но это путь медленнее, как я должен запустить запрос на выборке несколько раз для каждого удаления и предел не является поддерживается в вложенном выберите в HQL. Любые идеи или указатели? Благодарю. Это было сделано с использованием нативного SQL, с указанными выше методами. Но не я не могу найти способ, как реорганизовать его. Моя первая попытка была создать запрос с использованием вложенного выберите так: удалить из таблицы, где идентификатор в (выберите идентификатор из таблицы, где предел УСЛОВИЯ 1000), но это путь медленнее, как я должен запустить запрос на выборке несколько раз для каждого удаления и предел не является поддерживается в вложенном выберите в HQL. Любые идеи или указатели? Благодарю. Это было сделано с использованием нативного SQL, с указанными выше методами. Но не я не могу найти способ, как реорганизовать его. Моя первая попытка была создать запрос с использованием вложенного выберите так: удалить из таблицы, где идентификатор в (выберите идентификатор из таблицы, где предел УСЛОВИЯ 1000), но это путь медленнее, как я должен запустить запрос на выборке несколько раз для каждого удаления и предел не является поддерживается в вложенном выберите в HQL. Любые идеи или указатели? Благодарю.
viliam