2010-07-23 34 views
6

Tôi muốn tạo truy vấn này trong sqlalchemy. Bảng 'demande' tồn tại trong cơ sở dữ liệu. Có một truy vấn phụ tạo ra các dấu thời gian với hàm generate_series.Cách tạo truy vấn này trong 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; 

Tôi đã thử điều này:

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 

Nhưng nó than phiền với một InvalidRequesError: Không thể tìm thấy một mệnh đề FROM tham gia từ. Tôi đoán điều này là do truy vấn phụ.

Nếu tôi cố gắng để "đảo ngược" truy vấn, nó hoạt động nhưng nó có một 'nối ngoài bên trái':

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

Vì không có RIGHT OUTER JOIN trong SQLAlchemy, tôi chỉ muốn tìm cách để truy vấn con dưới dạng bảng đầu tiên và bảng 'demande' làm bảng thứ hai. Bằng cách này tôi sẽ có thể sử dụng LEFT OUTER JOIN

Trả lời

3

Ví dụ sau đây sẽ cho bạn một đầu mối (giả sử tôi đoán một cách chính xác rằng Demande là mô hình khai báo):

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

tôi phải cố gắng ngày mai này tại nơi làm việc, cảm ơn cho câu trả lời của bạn, nó có vẻ tốt đẹp –

+0

OK, bạn đã học được tôi một cái gì đó nhưng tôi vẫn cần phải làm việc trên nó để đạt được những gì tôi đang tìm kiếm. Dù sao cũng cảm ơn bạn –

Các vấn đề liên quan