Сохранение множества объектов Django с помощью одного большого оператора INSERT - PullRequest
3 голосов
/ 16 марта 2011

Представьте, что у вас следующая ситуация:

for i in xrange(100000):
  account = Account()
  account.foo = i
  account.save

Очевидно, что 100 000 INSERT операторов, выполняемых Django, займут некоторое время. Было бы лучше иметь возможность объединить все эти INSERT в один большой INSERT. Вот что я надеюсь сделать:

inserts = []

for i in xrange(100000):
  account = Account()
  account.foo = i
  inserts.append(account.insert_sql)

sql = 'INSERT INTO whatever... ' + ', '.join(inserts)

Есть ли способ сделать это с помощью QuerySet, не генерируя вручную все эти INSERT операторы?

Ответы [ 2 ]

7 голосов
/ 16 марта 2011

Как показано в этом связанном вопросе , можно использовать @transaction.commit_manually, чтобы объединить все операции .save() в один коммит для значительного повышения производительности.

@transaction.commit_manually
def your_view(request):
    try:
        for i in xrange(100000):
            account = Account()
            account.foo = i
            account.save()   
    except: 
        transaction.rollback()
    else:
        transaction.commit() 

В качестве альтернативы, если вы чувствуете себя предприимчивым, взгляните на этот фрагмент , в котором реализован менеджер для массовой вставки. Обратите внимание, что он работает только с MySQL, и некоторое время не обновлялся, поэтому трудно сказать, будет ли он хорошо работать с более новыми версиями Django.

0 голосов
/ 16 марта 2011

Вы можете использовать сырой SQL.

Либо Account.objects.raw(), либо с использованием объектов django.db.connection.

Возможно, это не вариант, если вы хотите поддерживать агностицизм в базе данных.

http://docs.djangoproject.com/en/dev/topics/db/sql/

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...