使用一个大插入语句保存多个Django对象

3 投票
2 回答
6541 浏览
提问于 2025-04-16 13:50

想象一下你遇到这样的情况:

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/

如果你只是一次性设置,使用数据文件可能会更好。

撰写回答