Pytanie SqlAlchemy wybierz z max, group_by i order_by


Muszę wyświetlić listę ostatnio zmodyfikowanych zasobów dla każdej grupy, ponieważ mogę wykonać to zapytanie:

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

Ale SqlAlchemy narzeka z:

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

Jak mogę wybrać tylko kolumny resource_group_id i last_modified?

W SQL, czego chcę, jest to:

SELECT resource_group_id, max(last_modified) AS max_1
FROM resource GROUP BY resource_group_id ORDER BY max_1 DESC

11
2017-10-30 21:26


pochodzenie




Odpowiedzi:


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

6
2017-10-30 22:04





Masz już to, ale postaram się wyjaśnić, co dzieje się z pierwotnym zapytaniem, by móc z niego skorzystać w przyszłości.

W sqlalchemy, jeśli określono query(model.Resource, ...), odniesienie do modelu, wyświetli każdą kolumnę w tabeli zasobów w wygenerowanej instrukcji SQL select, więc twoje pierwotne zapytanie będzie wyglądało mniej więcej tak:

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;

To nie zadziała w przypadku GROUP BY.

Typowym sposobem uniknięcia tego jest określenie, które kolumny mają być jawnie zaznaczone przez dodanie ich do metody zapytania .query(model.Resource.resource_group_id)


3
2017-10-31 00:46