2010-07-23 48 views
6

我想在sqlalchemy中生成這個查詢。數據庫中存在'demande'表。有一個使用generate_series函數生​​成時間步長的子查詢。如何在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; 

我已經試過這樣:

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 

但它與InvalidRequesError抱怨:找不到FROM子句從加盟。我想這是由子查詢造成的。

,如果我嘗試「反轉」的查詢,它的工作原理,但它確實「LEFT OUTER JOIN」:

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

由於沒有右外中SQLAlchemy的JOIN,我只是想找到一種方法將子查詢作爲第一個表格,將「demande」表格作爲第二個表格。這樣,我就可以使用LEFT OUTER JOIN

回答

3

下面的例子應該給你一個線索(假設我猜中即Demande是聲明模型):

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

我要試試這個,明天在工作中,感謝你的回答,看起來不錯 – 2010-10-25 19:53:01

+0

好的,你已經學會了一些東西,但我仍然需要努力去實現我所期待的。不管怎麼說,還是要謝謝你 – 2010-10-26 08:05:16

相關問題