2012-09-10 7 views
24

मैं SQLAlchemy में अभी शुरुआत कर रहा हूँ और क्वेरी 2 विधि में किया जा सकता पाया:SQLAlchemy में Model.query और session.query (मॉडल) के बीच क्या अंतर है?

दृष्टिकोण 1:

DBSession = scoped_session(sessionmaker()) 
class _Base(object): 
    query = DBSession.query_property() 

Base = declarative_base(cls=_Base) 

class SomeModel(Base): 
    key = Column(Unicode, primary_key=True) 
    value = Column(Unicode) 

# When querying 
result = SomeModel.query.filter(...) 

दृष्टिकोण 2

DBSession = scoped_session(sessionmaker()) 
Base = declarative_base() 

class SomeModel(Base): 
    key = Column(Unicode, primary_key=True) 
    value = Column(Unicode) 

# When querying 
session = DBSession() 
result = session.query(SomeModel).filter(...) 

उन दोनों के बीच कोई अंतर है?

उत्तर

1

मैं query_propety करने के लिए इन कमियां देखें:

  • आप इसे एक आप कॉन्फ़िगर कर दिया है तुलना में एक अलग सत्र पर उपयोग नहीं कर सकते हैं (हालांकि आप हमेशा तो session.query इस्तेमाल कर सकते हैं)।
  • आपको अपनी स्कीमा को परिभाषित करने से पहले एक सत्र ऑब्जेक्ट की आवश्यकता है।

उदाहरण के लिए, जब आप परीक्षण लिखना चाहते हैं तो ये आपको काट सकते हैं।

इसके अलावा, session.query एसक्यूएलकेमी कैसे काम करता है इसके साथ बेहतर फिट बैठता है; query_property ऐसा लगता है कि यह सुविधा के लिए शीर्ष पर जोड़ा गया है (या अन्य सिस्टम के साथ समानता?)। मैं आपको session.query पर चिपकने की सलाह दूंगा।

8

उपरोक्त कोड में, कोई अंतर नहीं है। इसका कारण यह है, पहला उदाहरण की लाइन 3 में:

  • query संपत्ति स्पष्ट रूप से DBSession
  • के लिए बाध्य है वहाँ कोई कस्टम Query वस्तु query_property

के लिए पारित @ Petr-Viktorin अंक के रूप में है answer here में बाहर, आपके मॉडल को पहले उदाहरण में परिभाषित करने से पहले एक सत्र उपलब्ध होना चाहिए, जो आपके आवेदन की संरचना के आधार पर समस्याग्रस्त हो सकता है।

यदि, हालांकि, आपको एक कस्टम क्वेरी की आवश्यकता है जो सभी प्रश्नों के लिए स्वचालित रूप से अतिरिक्त क्वेरी पैरामीटर जोड़ता है, तो केवल पहला उदाहरण ही इसकी अनुमति देगा। sqlalchemy.orm.query.Query से प्राप्त एक कस्टम क्वेरी क्लास को query_property पर तर्क के रूप में पारित किया जा सकता है। This question उस पैटर्न का एक उदाहरण दिखाता है।

भले ही किसी मॉडल ऑब्जेक्ट पर कस्टम क्वेरी प्रॉपर्टी परिभाषित हो, फिर भी उस प्रॉपर्टी का उपयोग session.query से पूछताछ के दौरान नहीं किया जाता है, जैसा कि दूसरे उदाहरण में अंतिम पंक्ति में होता है। इसका मतलब है कि पहले उदाहरण की तरह कुछ एकमात्र विकल्प है यदि आपको कस्टम क्वेरी क्लास की आवश्यकता है।

1

एक उत्तर (here) एक अलग SQLAlchemy सवाल करने में मदद कर सकते हैं।

आप Model.query उपयोग कर सकते हैं, क्योंकि Model (या आम तौर पर अपने आधार वर्ग, विशेष रूप से ऐसे मामलों में जहां कथात्मक विस्तार प्रयोग किया जाता है) Sesssion.query_property असाइन किया गया है: के साथ कि इसका जवाब शुरू होता है। इस मामले में Model.querySession.query(Model) के बराबर है।

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