2013-10-30 10 views
10

ich die letzten modifizierten Ressourcen für jede Gruppe zur Liste haben, für die ich diese Abfrage tun können:sqlalchemy wählen mit max, group_by und 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()) 

Aber sqlalchemy klagt mit:

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

Wie kann ich nur die Spalten resource_group_id und last_modified auswählen?

In SQL, was ich will, ist dies:

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

Antwort

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

Sie es schon bekam, aber ich werde versuchen zu erklären, was für die Zukunft mit der ursprünglichen Abfrage vor sich geht.

In sqlalchemy, wenn Sie angegeben query(model.Resource, ...), ein Referenzmodell, wird es jede Spalte auf der Ressourcentabelle Liste in der generierten SQL-Select-Anweisung, so dass Ihre ursprüngliche Abfrage etwas aussehen würde:

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; 

Dieses won‘ t arbeiten mit einer GROUP BY.

Ein üblicher Weg, dies zu vermeiden, ist zu bestimmen, welche Spalten Sie indem Sie sie an die Abfragemethode .query(model.Resource.resource_group_id)

explizit auswählen möchten