如何在不在python中迭代的情况下,明显地批量更新django模型的所有对象



基本上,我们可以在不这样做的情况下获得相同的结果:

from my_app import models
for prd,count in x.iteritems():
    models.AggregatedResult.objects.filter(product=prd).update(linked_epp_count=count)

很明显,x是一个字典,包含与AggregatedResult的乘积字段相同的键,"value"是我希望更新的计数。在<15k行,目前表的大小约为200k,预计将增长到100万。所以,我需要帮助。

最简单(但不是最安全)的方法是使用原始sql查询。

类似于:

for prd,count in x.iteritems():
    from django.db import connection, transaction
    cursor = connection.cursor()
    query = """
        UPDATE {table} 
        set {column} = {value} 
        where {condition} = {condition_value}""".format(
        table=AggregatedResult._meta.db_table,
        condition='product',
        condition_value=prd,
        column='linked_epp_count',
        value=count
    )
    cursor.execute(query)
    transaction.commit_unless_managed()

警告:未经测试,极易受到sql注入的攻击。使用风险自负

另一种(更安全的)方法是首先将x的内容加载到临时表中,而不是只发布一个原始查询进行更新。假设x的临时表为temp_prod:

update aggregated_result ar
set linked_epp_count=tp.count
from temp_prod tp
where ar.product = tp.product

如何将数据从x上传到临时表是我不太熟悉的事情,所以它留给你。:)

相关内容

  • 没有找到相关文章

最新更新