Django:批量操作

2024-01-07

商业:
我遇到了一个问题 - 当使用 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运营


Django 1.4+ 在其 ORM 中对批量操作提供了相当不错的支持,您应该看看是否可以使用它 - 这是最可移植的方式,并且使用起来也非常好。

它不仅允许更新所有对象中字段的相同值(这很简单),而且还可以根据其他字段更新字段值以及执行一些有限的计算。我不确定它是否适合您的需要(取决于“ Produce_some_ Differentied_data”的工作原理) - 您可以进行一些计算,其中一些可能不能。一些例子:

image_id_list = [1,5,6]
Image.objects.filter(image_id__in=image_id_list).
     update(views_number=F('views_number') + 1)

上面的示例将转换为类似于以下的 SQL:

UPDATE image SET views_number = views_number + 1 WHERE image_id IN (1,5,6);

这是进行批量更新的最快方法 - 比运行多个查询快得多。在单个 SQL 语句中运行多个查询并不能真正提高运行速度。真正改进的是创建一个像上面这样同时对多行进行操作的查询。您可以在更新语句中构建相当复杂的公式,因此如果您的“ Produce_some_Differentiated_data”方法可以以这种方式表示,那就最好了。即使不能直接完成,您也可以对模型进行一些修改并添加一些额外的字段来实现这一点。如果经常执行此类批量操作,这可能会有所回报。

来自 Django 的文档:

Django 支持使用加法、减法、乘法、 使用 F() 对象进行除法和模运算,两者都带有常量 以及其他 F() 对象。

更多相关信息请点击这里:https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once https://docs.djangoproject.com/en/dev/topics/db/queries/#updating-multiple-objects-at-once

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django:批量操作 的相关文章

随机推荐