1

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

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

? 很明显,x 是一个字典,其中包含与 AggregatedResult 的产品字段相同的键,而“值”是我希望更新的计数。在具有 < 15k 行的测试表上运行需要超过 2 到 3 分钟,该表的大小目前约为 200k,预计将增长到一百万。所以,我需要帮助。

4

1 回答 1

0

最简单(但不是最安全)的方法是使用raw sql query

就像是:

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临时表上传到我不是很精通,所以留给你。:)

于 2013-09-04T14:01:36.490 回答