2010-07-23 10 views
6

Quiero generar esta consulta en sqlalchemy. La tabla 'demande' existe en la base de datos. Hay una subconsulta que genera los timesteps con la función generate_series.¿Cómo generar esta consulta en 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; 

He intentado esto:

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 

Pero se queja con un InvalidRequesError: No se pudo encontrar una cláusula FROM para unirse a. Supongo que esto es causado por la subconsulta.

si trato de "invertir" la consulta, que funciona, pero lo hace una 'combinación externa izquierda':

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

Como no hay RIGHT OUTER JOIN en sqlalchemy, sólo quiero encontrar una manera tomar la subconsulta como la primera tabla y la tabla 'demande' como la segunda. De esta manera podré usar LEFT OUTER JOIN

Respuesta

3

el siguiente ejemplo se le debe dar una pista (suponiendo adiviné correctamente que Demande es modelo declarativo):

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

tengo que probar esto mañana en el trabajo, gracias por su respuesta, parece agradable –

+0

OK, usted me ha aprendido algo, pero todavía tengo que trabajar en ello para lograr lo que estoy buscando. Gracias de cualquier manera –

Cuestiones relacionadas