2012-01-15 22 views
5

SQLAlchemy में के साथ एक ही मेज पर एकाधिक विदेशी चाबियाँ, Foo को, Bar कल्पना हम एक यौगिक प्राथमिक कुंजी के साथ एक मेज Foo है, और जो इसे जोड़ने दो विदेशी कुंजी constrains है (प्रत्येक Bar दो Foo वस्तुएं हैं)।SQLAlchemy: यौगिक प्राथमिक कुंजी

मेरे समस्या relationship समारोह है, जो मुझे जानकारी (primaryjoin में) जो मैं पहले से ही ForeightKeyConstraint (उल्लंघन करने सूखी) में दे दिया है दोहराने बनाता है के साथ है। क्या इसे संरचित करने का कोई और तरीका है ताकि मुझे जानकारी दोहराने की ज़रूरत न हो? प्रासंगिक ForeignKeyConstraint से relationship पास करने का कोई तरीका?

class Foo(Base): 
    __tablename__ = "Foo" 
    id_1 = Column(Integer, primary_key=True) 
    id_2 = Column(Integer, primary_key=True) 

class Bar(Base): 
    __tablename__ = "Bar" 
    id = Column(Integer, primary_key=True) 

    foo_1_id_1 = Column(Integer) 
    foo_1_id_2 = Column(Integer) 

    foo_2_id_1 = Column(Integer) 
    foo_2_id_2 = Column(Integer) 

    __table_args__ = (
      ForeignKeyConstraint(
       [foo_1_id_1,foo_1_id_2], 
       [Foo.id_1,Foo.id_2] 
       ), 
      ForeignKeyConstraint(
       [foo_2_id_1,foo_2_id_2], 
       [Foo.id_1,Foo.id_2] 
       ) 
      ) 

    foo_1 = relationship(Foo,primaryjoin="(Bar.foo_1_id_1 == Foo.id_1) & (Bar.foo_1_id_2 == Foo.id_2)") 
    foo_2 = relationship(Foo,primaryjoin="(Bar.foo_2_id_1 == Foo.id_1) & (Bar.foo_2_id_2 == Foo.id_2)") 

धन्यवाद।

उत्तर

2

relationship(), जैसा कि है, इसकी पूर्ण कॉन्फ़िगरेशन निर्धारित नहीं कर सकता है। यह हमेशा ऐसा होता है जब संबंधित तालिका को संदर्भित करने के एक से अधिक तरीके होते हैं।
आपके उदाहरण में ऐसा लगता है जैसे कॉलक्लेमी कॉलम के नाम से अनुमान लगाने के लिए पर्याप्त स्मार्ट हो सकता है, लेकिन ऐसा नहीं है और यह नहीं होना चाहिए।

अगर आप जानकारी पुनरावृत्ति है, वास्तव में आप सिर्फ विशिष्ट अपने रिश्ते विन्यास के बारे में किया जा रहा है के रूप में लग सकता है यद्यपि।

वास्तव में कॉन्फ़िगरेशन में foreign_keys निर्दिष्ट करने का विकल्प है, लेकिन वर्तमान में कुछ अलग उद्देश्य प्रदान करता है, इसलिए आपको अभी भी primaryjoin कॉन्फ़िगर करने की आवश्यकता होगी।

+0

धन्यवाद। लेकिन पुनरावृत्ति है। मुझे एहसास है कि यह नहीं जानता कि किस 'विदेशीके कॉन्स्ट्रेन' का उपयोग करना है। लेकिन अगर, उदाहरण के लिए, मैं किसी भी तरह से 'रिश्तेदार' के लिए प्रासंगिक 'विदेशीके कॉन्स्ट्रेन' का संदर्भ दे सकता हूं, और यह स्वयं के लिए अभिव्यक्ति अभिव्यक्ति को समझ सकता है (जैसे ऐसा होता है जब दिए गए तालिका में केवल एक 'विदेशीके कॉन्स्ट्रेन' होता है) तो वह शामिल होने के विवरण की पुनरावृत्ति को खत्म कर देगा। – DaedalusFall

+0

सच है, और वास्तव में, जैसा कि बताया गया है, रिश्तों को 'विदेशी_की 'प्रदान करने की संभावना है, लेकिन वर्तमान में इसका उपयोग' प्राथमिकजॉइन 'स्थिति का अनुमान लगाने के लिए नहीं किया जाता है। आपका मामला अच्छा उदाहरण है जहां इसे इस तरह इस्तेमाल किया जा सकता है। लेकिन जैसा कि उत्तर में बताया गया है, * वर्तमान में * यह नहीं है। लेकिन आप http://www.sqlalchemy.org/trac/ – van

+0

पर फीचर अनुरोध टिकट क्यों नहीं बनाते हैं, तो मैं यह सुनिश्चित करना चाहता था कि मुझे कुछ स्पष्ट याद नहीं आ रहा है, जो ज्यादातर अब तक मामला रहा है मेरी स्क्लेक्लेमी दुःख! – DaedalusFall

0

आप foreign_keys और विदेशी कुंजी की एक सूची का भी उपयोग कर सकते हैं।

देखें Multiple Join Paths

foo_1 = relationship(Foo, foreign_keys=[foo_1_id_1, foo_2_id_2]) 
foo_2 = relationship(Foo, foreign_keys=[foo_2_id_1, foo_2_id_2]) 
संबंधित मुद्दे