我必须列出每个组的最后修改资源,因为我可以执行此查询:
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
答案 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)