使用一个大的INSERT语句保存许多Django对象

时间:2011-03-16 16:20:19

标签: python django

想象一下你有以下情况:

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

显然,Django执行的100,000 INSERT语句需要一些时间。能够将所有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 个答案:

答案 0 :(得分:7)

如图in this related question所示,可以使用@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() 

或者,如果您喜欢冒险,请查看this snippet,它实现了批量插入管理器。请注意,它仅适用于MySQL,并且一段时间没有更新,因此很难判断它是否会与较新版本的Django一起使用。

答案 1 :(得分:0)

您可以使用原始SQL。

通过Account.objects.raw()或使用django.db.connection对象。

如果您想维护数据库不可知性,这可能不是一个选项。

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

如果你正在做的是一次性设置,也许使用夹具会更好。