想象一下你有以下情况:
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
语句?
答案 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/
如果你正在做的是一次性设置,也许使用夹具会更好。