【发布时间】:2012-12-11 16:38:38
【问题描述】:
业务:
我遇到了一个问题 - 当使用 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 操作
【问题讨论】:
-
您是否尝试过在每个命令创建时执行,而不是创建一个列表然后执行?
-
@monkut 当然,但在这种情况下,Django 在执行每个元素时都会寻址到 DB,这会导致巨大速度变慢。
-
您是在更新模型还是只是在更新未映射到模型的常规表?如果您正在尝试批量更新模型,可以尝试docs.djangoproject.com/en/dev/topics/db/queries/…
-
另外,您可以使用 IN 子句来避免多次查询:tutorialspoint.com/mysql/mysql-in-clause.htm
-
@msc 指向使用多个值而不是相同值更新多个对象。回答您的问题 - 是的,它与模型有关。
标签: python sql django orm bulk