SqlAlchemy选择max,group_by和order_by

ani*_*bal 12 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())
Run Code Online (Sandbox Code Playgroud)

但是SqlAlchemy抱怨:

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

我如何只选择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
Run Code Online (Sandbox Code Playgroud)

ani*_*bal 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())
Run Code Online (Sandbox Code Playgroud)

  • 这里需要“order_by”吗?难道“max”已经足够在这里正确聚合了吗? (2认同)

gon*_*onz 5

您已经明白了,但我将尝试解释原始查询的情况以供将来参考。

在 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;
Run Code Online (Sandbox Code Playgroud)

这不适用于 GROUP BY。

避免这种情况的常见方法是通过将列添加到查询方法来指定要显式选择的列.query(model.Resource.resource_group_id)