在django模型中基于子组插入SQL

时间:2015-09-01 14:02:54

标签: python mysql django

我有以下sheetinfo模型,其中包含以下数据:

|    Trav    |   Group    |   Subgroup   | Sheet_num  | T_val  |
|  SAT123A01 |   SAT123   |      A       |     1      |   400  |
|  SAT123A02 |   SAT123   |      A       |     2      |   0    |
|  SAT123A03 |   SAT123   |      A       |     3      |   0    |
|  SAT123A04 |   SAT123   |      A       |     4      |   0    |
|  SAT123A05 |   SAT123   |      A       |     5      |   500  |
|  SAT123B05 |   SAT123   |      B       |     5      |   400  |
|  SAT123B04 |   SAT123   |      B       |     4      |   0    |
|  SAT123B03 |   SAT123   |      B       |     3      |   0    |
|  SAT123B02 |   SAT123   |      B       |     2      |   500  |
|  SAT124A01 |   SAT124   |      A       |     1      |   400  |
|  SAT124A02 |   SAT124   |      A       |     2      |    0   |
|  SAT124A03 |   SAT124   |      A       |     3      |    0   |
|  SAT124A04 |   SAT124   |      A       |     4      |   475  |

我想用正确的T_val插入和更新表。

公式是:

new_t_val = delta / (cnt -1) * sheet_num + min_tvc_of_subgroup   

例如前5名:

|    Trav    |   Group    |   Subgroup   | Sheet_num  | T_val  |
|  SAT123A01 |   SAT123   |      A       |     1      |   400  |
|  SAT123A02 |   SAT123   |      A       |     2      |   425  |
|  SAT123A03 |   SAT123   |      A       |     3      |   450  |
|  SAT123A04 |   SAT123   |      A       |     4      |   475  |
|  SAT123A05 |   SAT123   |      A       |     5      |   500  |

我有一个用于更新数据的django查询,但它是SLOW并在一段时间后停止(由于类型错误等)。

我的问题是有没有办法在SQL中实现这一点?

1 个答案:

答案 0 :(得分:1)

作为一个数据库调用执行此操作的能力并不存在于Django库存中。但是存在第三方包:https://github.com/aykut/django-bulk-update

该包的工作原理示例:

rows = Model.objects.all()
for row in rows:
    # Modify rows as appropriate
    row.T_val = delta / (cnt -1) * row.sheet_num + min_tvc_of_subgroup
Model.objects.bulk_update(rows)

对于最大1,000,000范围的数据集,这应该具有合理的性能。迭代和.save() - 每个对象的大部分瓶颈是数据库调用的开销。 python部分相当快。上面的例子只有两个数据库调用,所以它可能是一个数量级或两个更快。