У меня есть данные в базе данных, которые необходимо обновлять перидоциально. Источник данных возвращает все, что доступно в этот момент времени, поэтому будет включать новые данные, которых еще нет в базе данных.Django batching/bulk update_or_create?
Как я прохожу через исходные данные, я не хочу делать 1000 отдельных записей, если это возможно.
Есть ли что-нибудь такое, как update_or_create
, но работает партиями?
Одна мысль заключалась в использовании update_or_create
в сочетании с ручными транзакциями, но я не уверен, что это просто очередная запись отдельных записей или если она объединит все это в одну вставку SQL?
Или аналогичным образом мог бы использовать @commit_on_success()
по функции с update_or_create
внутри работы цикла?
Я ничего не делаю с данными, кроме перевода и сохранения его в модель. Ничто не зависит от этой модели, существующей во время цикла
Я думаю, что нет ни одного запроса для обновления или создания на большинстве sql-серверов. В [postgres 9.5] есть один (https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.5#INSERT_..._ON_CONFLICT_DO_NOTHING.2FUPDATE_.28.22UPSERT.22.29), но django не поддерживает его. Сделки не приведут к «одиночному» запросу. он просто гарантирует, что все запросы потерпят неудачу, если вы потерпите неудачу. На самом деле это замедлит все запросы. – imposeren
Обновление. Я ошибся в транзакциях. Использование единой транзакции для всех операций ускорит ваши записи. Это, по крайней мере, верно для postgres и sqlite: https://github.com/coderholic/django-cities/pull/85#issuecomment-125177370 – imposeren