15

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

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
4

2 回答 2

10
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())
于 2013-10-30T22:04:08.267 回答
4

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

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

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)

于 2013-10-31T00:46:35.347 回答