2010-07-23 21 views
6

Voglio generare questa query in sqlalchemy. La tabella 'demande' esiste nel database. Esiste una sottoquery che genera i timestep con la funzione generate_series.Come generare questa query in sqlalchemy?

SELECT 
    timesteps.timestep AS timestep, d.count AS count 
FROM 
    (SELECT 
     DATE_TRUNC('hour',date_demande) AS timestep, 
     COUNT(id) AS count 
    FROM 
     demande 
    GROUP BY 
     timestep 
    ) AS d 

RIGHT OUTER JOIN 
    (SELECT 
     timestep 
    FROM 
     generate_series('2010-01-01 00:00:00'::timestamp, 
         '2010-01-01 23:59:59'::timestamp, 
         '1 hour'::interval) AS timestep 
    ) AS timesteps 
    ON d.timestep = timesteps.timestep 

ORDER BY timestep; 

Ho provato questo:

stmt = session.query(
     func. 
      generate_series(
       datetime.datetime(2010,1,1,0,0,0), 
       datetime.datetime(2010,1,1,23,59,59), 
       cast('1 hour',Interval())). 
      label('timestep') 
     ).subquery() 
print stmt 
q = session.query(
     stmt.c.timestep, 
     func.count(Demande.id)). 
    outerjoin((Demande, grouped==stmt.c.timestep)). 
    group_by(stmt.c.timestep) 
print q 

Ma si lamenta con un InvalidRequesError: Impossibile trovare una clausola FROM di aderire da. Immagino che questo sia causato dalla subquery.

se provo a "invertire" la query, funziona ma fa un 'join esterno sinistro':

q = session.query(
     func.count(Demande.id), 
     stmt.c.timestep). 
    outerjoin((stmt, grouped==stmt.c.timestep)). 
    group_by(stmt.c.timestep) 

Poiché non esiste un diritto OUTER JOIN in SQLAlchemy, voglio solo trovare un modo prendere la sottoquery come prima tabella e la tabella 'demande' come seconda. In questo modo sarò in grado di utilizzare LEFT OUTER JOIN

risposta

3

L'esempio seguente dovrebbe darvi un indizio (supponendo che indovinato che Demande è il modello dichiarativo):

joined = stmt.outerjoin(Demande.__table__, Demande.grouped==stmt.c.timestep) 
q = session.query(stmt.c.timestep, func.count(Demande.id)).\ 
     select_from(joined).\ 
     group_by(stmt.c.timestep) 
+0

devo provare domani al lavoro, grazie per la tua risposta, sembra bello –

+0

OK, mi hai imparato qualcosa ma ho ancora bisogno di lavorarci per ottenere quello che sto cercando. Grazie comunque –