2010-07-23 11 views
6

मैं इस क्वेरी को sqlalchemy में जेनरेट करना चाहता हूं। तालिका 'मांग' डेटाबेस में मौजूद है। एक उपक्वायर है जो जेनर_एसरीज़ फ़ंक्शन के साथ टाइमस्टेप्स उत्पन्न करता है।इस क्वेरी को 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 साथ शिकायत: एक खंड से शामिल होने के लिए से नहीं मिल सका। मुझे लगता है कि यह सबक्वायरी के कारण होता है।

तो मैं "को उलटने के" करने के लिए क्वेरी, यह काम करता है की कोशिश लेकिन यह एक 'LEFT बाहरी शामिल हों' करता है:

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

है के रूप में कोई सही बाहरी SQLAlchemy में शामिल हों, मैं सिर्फ एक रास्ता खोजने के लिए चाहते हैं पहली तालिका के रूप में subquery लेने के लिए और 'मांग' तालिका दूसरे के रूप में लेने के लिए। इस तरह से मैं उपयोग करने के लिए वाम बाहरी शामिल हों

उत्तर

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

मैं काम पर इस कल की कोशिश करने के लिए है, आपके उत्तर के लिए धन्यवाद, यह अच्छा लगता है –

+0

ठीक है, आपने मुझे कुछ सीखा है लेकिन मुझे अभी भी उस चीज़ को हासिल करने की आवश्यकता है जो मैं ढूंढ रहा हूं। फिर भी धन्यवाद –

संबंधित मुद्दे