SqlAlchemy选择max,group_by和order_by

时间:2013-10-30 21:26:41

标签: python sqlalchemy

我必须列出每个组的最后修改资源,因为我可以执行此查询:

model.Session.query(
    model.Resource, func.max(model.Resource.last_modified)
).group_by(model.Resource.resource_group_id).order_by(
    model.Resource.last_modified.desc())

但是SqlAlchemy抱怨道:

ProgrammingError: (ProgrammingError) column "resource.id" must appear in
the GROUP BY clause or be used in an aggregate function

如何只选择resource_group_id和last_modified列?

在SQL中,我想要的是:

SELECT resource_group_id, max(last_modified) AS max_1
FROM resource GROUP BY resource_group_id ORDER BY max_1 DESC

2 个答案:

答案 0 :(得分:7)

model.Session.query(
    model.Resource.resource_group_id, func.max(model.Resource.last_modified)
).group_by(model.Resource.resource_group_id).order_by(
    func.max(model.Resource.last_modified).desc())

答案 1 :(得分:3)

你已经知道了,但我会尝试解释原始查询的内容以供将来参考。

在sqlalchemy中,如果您指定了query(model.Resource, ...)模型引用,它将在生成的SQL select语句中列出资源表中的每一列,因此您的原始查询将类似于:

SELECT resource.resource_group_id AS resource_group_id,
       resource.extra_column1 AS extra_column1,
       resource.extra_column2 AS extra_column2,
       ...
       count(resource.resource_group_id) AS max_1
GROUP BY resource_group_id ORDER BY max_1 DESC;

这不适用于GROUP BY。

避免这种情况的常用方法是通过将它们添加到查询方法.query(model.Resource.resource_group_id)

来指定要明确选择的列。