我有一个很大的PostgreSQL表,可以通过Django访问.因为Django的ORM不支持窗口函数,所以我需要将窗口函数的结果作为常规列烘焙到表中.我想这样做:

UPDATE  table_name
SET     col1 = ROW_NUMBER() OVER ( PARTITION BY col2 ORDER BY col3 );

但我得到ERROR: cannot use window function in UPDATE

有没有人能提出另一种方法?通过Django的.raw()方法传递窗口函数语法是不合适的,因为它返回一个RawQuerySet,它不支持进一步的ORM特性,如我需要的.filter().

谢谢你.

推荐答案

错误来自Postgres,而不是Django.您可以将其重写为:

WITH v_table_name AS
(
    SELECT row_number() over (partition by col2 order by col3) AS rn, primary_key
    FROM table_name
) 
UPDATE table_name set table_name.col1 = v_table_name.rn
FROM v_table_name
WHERE table_name.primary_key = v_table_name.primary_key;  

或者,也可以 Select :

UPDATE table_name set table_name.col1 = v_table_name.rn
FROM  
(
    SELECT row_number() over (partition by col2 order by col3) AS rn, primary_key
    FROM table_name
) AS v_table_name
WHERE table_name.primary_key = v_table_name.primary_key;

这很管用.刚刚在postgres-9.6上测试过.下面是UPDATE的语法(参见可选的fromlist).

希望这有帮助.

Django相关问答推荐

如何在Django中更改模型字段名称?

Django ORM Groupby

如何在Django CMS中更新上下文

无法在views.py django中验证密码

Django 根据子级过滤父级

使用 Crispy Forms 时 Django 返回 'TemplateDoesNotExist'

在Django Rest Framework中按模型属性排序时如何避免重新计算?

在 Django 模板中呈现标签名称而不是整数字段

如何让两个模型相互引用 Django

如何在 django 模板中将名称反转为绝对 url?

如何在终端中切换 Python 版本?

如何在 django-rest-framework 中为 API 使用 TokenAuthentication

PyMongo vs MongoEngine for Django

Django:如何使用动态(非模型)数据预填充 FormView?

如何在 Django 中配置 X-Frame-Options 以允许 iframe 嵌入一个视图?

Django模板转义

Django 覆盖模型 Clean() 与 Save()

如何在 Django 中执行批量插入?

如何找到两个 Django 查询集的交集?

如何使用或使用 Django 的模型过滤系统?