2011-06-05 13 views
12

में ओआरएम मैपिंग के साथ बाहरी शामिल हों I SQLAlchemy 0.6.8 में ORM मैपिंग का उपयोग कर रहा हूं।SQLAlchemy

मेरे पास तीन टेबल (ए, बी और सी) हैं, जिनमें उनके बीच कोई विदेशी कुंजी नहीं है।

मैं मेज ए और बी में शामिल होने की कोशिश कर रहा हूँ, और फिर बाहरी छोड़ दिया में शामिल होने कि सी के साथ मैं एक नामित टपल की उम्मीद कर रहा हूँ क्षेत्रों ए, बी और सी के साथ, -। सी क्षेत्र कभी कभी कोई नहीं पर सेट के साथ)

मैं बस दोनों टेबल का चयन करके आसानी से पर्याप्त रूप से शामिल हो सकता हूं।

(session.query(A, B) 
    .filter(A.some_field = B.some_other_field)) 

मुझे क्षेत्रों ए और बी

मैं तो बाहरी में शामिल होने को जोड़ने के साथ एक NamedTuple हो जाता है यही कारण है, इसे बनाने के लिए:

(session.query(A, B) 
    .filter(A.some_field==B.some_other_field)) 
    .outerjoin((C, A.some_field==C.some_different_field)) 

परिणाम अभी तक केवल दो तालिकाओं है। मैं सी के अन्य क्षेत्रों तक नहीं पहुंच सकता (यहां तक ​​कि उन मामलों में जहां वे मौजूद हैं)।

दाएं बाहरी भाग के क्षेत्र में पहुंच प्राप्त करने के लिए बाएं बाहरी जुड़ने का सही तरीका क्या है ??

यदि मैं इससे बच सकता हूं तो मैं मूल एसक्यूएल पर वापस नहीं आऊंगा - मैं ओआरएम का लाभ उठाने के लिए सीखने की कोशिश कर रहा हूं। अपने ही सवाल का

+0

मैं बाहर काम करने के सबक्वेरी और अन्य नाम एक समाधान प्रदान कर सकते हैं कोशिश कर रहा हूँ, लेकिन यह सही दिशा का मन नहीं करता। – Oddthinking

उत्तर

14

यह काम करना चाहिए:

(session.query(A) 
    .join(B, A.some_field == B.some_other_field) 
    .outerjoin(C, A.some_field == C.some_different_field) 
    .add_entity(B) 
    .add_entity(C)) 
0

अंतरिम जवाब:

इस कोड को एसक्यूएल मैं चाहता हूँ पैदा हुआ प्रतीत होता है:

(session.query(A, B, C) 
    .filter(A.some_field==B.some_other_field)) 
    .outerjoin((C, A.some_field==C.some_different_field)) 

नोट मूल session.query कॉल करने के लिए सी पैरामीटर के अलावा।

यह ऐसा नहीं लगता है जो मैंने सोचा था कि यह क्या करेगा: बी के साथ शामिल हो गए सी सी के साथ शामिल हो गए।

मैं अभी भी परीक्षण कर रहा हूं।