业务:
我遇到了一个问题 - 当使用 Django ORM 处理大型数据集时,规范的方式是处理每个元素。但是当然这种方式是非常低效的。所以我决定使用原始 SQL。
物质:
我有一个基本代码,它形成 SQL 查询,更新表的行,并提交它:
from myapp import Model
from django.db import connection, transaction
COUNT = Model.objects.count()
MYDATA = produce_some_differentiated_data() #Creating individual value for each row
cursor = connection.cursor()
str = []
for i in xrange(1, COUNT):
str.append("UPDATE database.table\n"
"SET field_to_modify={}\n"
"WHERE primary_key_field={};\n".format(MYDATA, i))
str = ''.join(str)
cursor.execute(str)
transaction.commit_unless_managed() #This cause exception
在最后一个陈述中,我得到了这个,即使SIZE
很小:
_mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now")
也许 Django 不允许一次执行多个 SQL 查询?
ps 在提交之前关闭游标有助于避免异常,但这是正确的吗?
我的期望:
我正在为批量操作寻找所有可能的可靠解决方案(最好在 Django 内部)。我不在乎它是 ORM 还是原始 SQL,如果我能避免错误,我会支持上面粘贴的代码。在没有解决方案的情况下,至少出于好奇,知道这个异常的原因是好的。
除了答案,我还学到了什么:
在 Django 1.4 中引入bulk_create
了高效的多重INSERT
操作