使用一个大插入语句保存多个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 个回答
8
如同这个相关问题中所示,你可以使用@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
你可以使用原始的SQL语句。
可以通过 Account.objects.raw()
或者使用 django.db.connection 对象来实现。
如果你想保持对数据库的独立性,这可能就不是一个好选择。
http://docs.djangoproject.com/en/dev/topics/db/sql/
如果你只是一次性设置,使用数据文件可能会更好。