Ответ 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())
Мне нужно перечислить последние измененные ресурсы для каждой группы, так как я могу выполнить этот запрос:
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
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())
У вас уже есть это, но я попытаюсь объяснить, что происходит с исходным запросом для справки в будущем.
В 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)