商业:
我遇到了一个问题 - 当使用 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 查询?
附注
在提交之前关闭游标有助于避免异常,但这正确吗?
我的期望:
我正在寻找批量操作的所有可能的可靠解决方案(最好在 Django 内部)。
我不关心它是 ORM 还是原始 SQL,如果可以避免错误,我会坚持上面粘贴的代码。如果没有解决方案,至少出于好奇,了解此异常的原因是有好处的。
除了答案之外我还学到了什么:
在Django 1.4中引入bulk_create https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create,对于有效倍数INSERT
运营