2010-07-23 8 views
6

Chcę wygenerować to zapytanie w sqlalchemy. Tabela "demande" istnieje w bazie danych. Istnieje podzapytanie, które generuje timesteps z funkcją generate_series.Jak wygenerować to zapytanie w 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; 

Próbowałem to:

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 

Ale narzeka z InvalidRequesError: nie udało się znaleźć klauzula FROM do przyłączenia się od. Przypuszczam, że jest to spowodowane przez podzapytanie.

jeśli staram się „odwrócić” kwerendy, to działa, ale to robi „LEFT OUTER JOIN”:

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

Ponieważ nie ma RIGHT OUTER JOIN w SQLAlchemy, po prostu chcę znaleźć sposób aby podzapytać jako pierwszą tabelę i tabelę "żądań" jako drugą. W ten sposób będę mógł korzystać z LEFT OUTER JOIN

Odpowiedz

3

Poniższy przykład powinien dać wskazówkę (przy założeniu, że prawidłowo odgadł, że Demande jest deklaratywne modelu):

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

muszę spróbować to jutro w pracy, Dziękuję za twoją odpowiedź, wydaje się miło –

+0

OK, nauczyłeś się czegoś, ale nadal muszę nad tym pracować, aby osiągnąć to, czego szukam. Dzięki i tak –

Powiązane problemy