2013-06-26 10 views
7

के साथ एक विदेशीकी संदर्भ बनाने के लिए कैसे हाय मैं समझ नहीं पा रहा हूं कि sqlalchemy का उपयोग कर विदेशीकी संदर्भ कैसे बनाया जाए। मैं अपने डेटाबेस में एक नई तालिका ग्राहक बनाया है:sqlalchemy

class Client(DeclarativeBase): 

    __tablename__ = 'client' 

    id = Column(Integer, primary_key=True) 

    user_id = Column(
     Integer, 
     ForeignKey('user.id', ondelete='CASCADE'), 
     nullable=False, 
     index=True, 
    ) 



    orgname = Column(Unicode, nullable=False) 

    def __init__(self, **kwargs): 
     super(Client, self).__init__(**kwargs) 

नहीं मैं इस

u = User(user_name=u'dusual') 
session.add(u) 
c = Client(user=u, orgname="dummy_org") 
session.add(c) 

की तरह कुछ करने के लिए कोशिश कर रहा हूँ लेकिन SQLAlchemy वापस कह चिल्लाना:।

(कश्मीर, cls_ नाम)) टाइप एरर: 'उपयोगकर्ता' क्लाइंट

के लिए एक अवैध कीवर्ड तर्क है अब यह ओबी नहीं होना चाहिए उत्सुक है कि उपयोगकर्ता को एक कीवर्ड तर्क के रूप में अनुमति दी जानी चाहिए कि मैं कैसे सुनिश्चित कर सकता हूं कि मेरी तालिका उपयोगकर्ता कीवर्ड तर्क लेने में सक्षम है। - या तो बताए द्वारा

sqlalchemy.orm आयात रिश्ते से

class Client(DeclarativeBase): 

    __tablename__ = 'client' 

    id = Column(Integer, primary_key=True) 

    user_id = Column(
     Integer, 
     ForeignKey('user.id', ondelete='CASCADE'), 
     nullable=False, 
     # no need to add index=True, all FKs have indexes 
    ) 
    user = relationship('User', backref='clients') 

    orgname = Column(Unicode, nullable=False) 

    # no need to add a constructor 

तो आप दो तरह से User के उदाहरण और Client मॉडल संबद्ध कर सकते हैं

:

उत्तर

15

आप Client एक relationshipUser के बीच और मॉडल परिभाषित करने की जरूरत Client.user_id:

u = User(user_name=u'dusual') 
session.add(u) 
session.flush() # to make sure the id is fetched from the database 
c = Client(user_id=u.id, orgname="dummy_org") 
session.add(c) 
के लिए एक पूर्णांक

या User उदाहरण Client.user पर उदाहरण के द्वारा। -

u = User(user_name=u'dusual') 
# no need to flush, no need to add `u` to the session because sqlalchemy becomes aware of the object once we assign it to c.user 
c = Client(user=u, orgname="dummy_org") 
session.add(c) 

वास्तव में, वहाँ एक तीसरा रास्ता है, क्योंकि हम Client.user पर एक backref कॉन्फ़िगर किया है, SQLAlchemy हमारे User मॉडल के लिए एक सूची की तरह clients विशेषता कहा:

u = User(user_name=u'dusual') 
u.clients.append(Client(orgname="dummy_org")) 
session.add(u) 
+1

ठीक है, स्पष्ट रूप से एक रिश्ता काम करता है की घोषणा । लेकिन मैं सोच रहा था कि क्या कोई अंतर्निहित तरीका है जिसमें यह काम करता है क्योंकि ऐसा लगता है कि मैं उस कोड के लिए काम करता हूं जो मैं संदर्भ – dusual

+0

अच्छाई के लिए देख रहा था :) अच्छी तरह से विस्तारित – deeshank