2013-10-30 20 views
10

devo elencare le ultime risorse modificati per ogni gruppo, per quello che posso fare questa domanda:SQLAlchemy selezionare con Max, group_by e 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()) 

Ma SQLAlchemy si lamenta con:

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

Come posso selezionare solo le colonne resource_group_id e last_modified?

In SQL quello che voglio è questo:

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

risposta

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

È già ce l'ha, ma cercherò di spiegare cosa sta succedendo con la query originale per riferimento futuro.

In sqlalchemy se è stato specificato query(model.Resource, ...), un punto di riferimento del modello, elencherà ogni colonna sulla tabella delle risorse nell'istruzione SELECT SQL generato, in modo che le query originale sarebbe simile:

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; 

questo ha vinto' t lavorare con GROUP BY.

Un modo comune per evitare questo è quello di specificare quali colonne che si desidera selezionare esplicitamente aggiungendoli al metodo di query .query(model.Resource.resource_group_id)