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

Ответ 1

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

Ответ 2

У вас уже есть это, но я попытаюсь объяснить, что происходит с исходным запросом для справки в будущем.

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