问题 SqlAlchemy选择max,group_by和order_by


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

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

12837
2017-10-30 21:26


起源



答案:


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())

6
2017-10-30 22:04





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

在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)


3
2017-10-31 00:46