2016-12-28 11 views
8

मैं आखिरकार एसक्यूएलकेमी सीखने के लिए एक मिशन पर हूं ताकि आने वाले सालों में मैं लाभ उठा सकूं।sqlalchemy क्लासिकल मैपिंग रिलेशनशिप इश्यू

मैं स्क्लेल्चेमी दस्तावेजों में गहरी गर्दन हूं और पिछले दो दिनों से रहा हूं। मैं घोषणात्मक के बजाय क्लासिकल मैपिंग तरीके सीखने के लिए नरक हूं, बीसी डीबी मैं अस्तित्व में रहना चाहता हूं, और इसके सभी टेबलों में एक अद्वितीय आईडी कॉलम नहीं है। According to this article classical mapping is the way to go under such circumstances

मैं sqlalchemy साइट से शास्त्रीय उदाहरणों का पालन कर रहा हूं, लेकिन मुझे यह काम करने के लिए सही रिलेशनशिप कॉन्फ़िगरेशन नहीं मिल रहा है।

engine = create_engine(
    "mssql+pyodbc://someaddress/test?driver=FreeTDS?TDS_version=8.0", echo=True) 

metadata = MetaData(engine) 

class User(object): 

    def __repr__(self): 
     return "<User(User_id='%s', name='%s', age='%s')>" % (
          self.user_id, self.name, self.age) 
class Email(object): 

    def __repr__(self): 
     return "<User(email_id='%s', address='%s', user_id='%s')>" % (
          self.email_id, self.address, self.user_id) 

users = Table('users', metadata, 
    Column('user_id', Integer, primary_key=True), 
    Column('name', String(40)), 
    Column('age', Integer), 
    schema='test.dbo.users') 

mapper(User, users, properties={'Email': relationship(Email, primaryjoin=users.c.user_id==emails.c.user_id)}) 

emails = Table('emails', metadata, 
    Column('email_id', Integer, primary_key=True), 
    Column('address', String), 
    Column('user_id', Integer, ForeignKey('test.dbo.users.user_id')), 
    schema='test.dbo.emails') 

mapper(Email, emails) 

Session = sessionmaker(bind=engine) 
session = Session() 

mary = session.query(User, Email).filter(User.user_id == Email.user_id) 

पीछा त्रुटि संदेश यह स्पष्ट करता है यह नक्शाकार/रिश्ता है कि समस्या यह है है कि:

यहाँ मेरी सभी कोड है।

InvalidRequestError: One or more mappers failed to initialize - can't proceed with initialization of other mappers. Original exception was: Could not determine join condition between parent/child tables on relationship User.Email - there are no foreign keys linking these tables. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify a 'primaryjoin' expression. 

मैंने उपाय करने की कोशिश करने के लिए विभिन्न चीजों की एक लंबी सूची की कोशिश की है, लेकिन मैं बस इसके नीचे नहीं जा सकता।

सही दिशा में किसी भी पॉइंटर्स की बहुत सराहना की जाएगी!

मैं जिस SQLLchemy संस्करण पर हूं;

'1.0.12' 
+0

आप इसे कैसे में 'primaryjoin' मान सेट के बिना की कोशिश की' उपयोगकर्ता 'मैपर गुण? मुझे _think_ नहीं है और आपको इसकी आवश्यकता है और आप मौजूद होने से पहले 'ईमेल' का संदर्भ दे रहे हैं। – Jack

+0

हाय @ जैक। आपकी रूचि के लिए धन्यवाद। मेरे पास है। मुझे तब निम्न त्रुटि मिलती है: 'NoForeignKeysError: रिलेशनशिप पर माता-पिता/बाल तालिकाओं के बीच जुड़ने की स्थिति निर्धारित नहीं कर सका User.Email - इन तालिकाओं को जोड़ने वाली कोई विदेशी कुंजी नहीं है। सुनिश्चित करें कि कॉलम का संदर्भ किसी विदेशीकी या ForeignKeyConstraint से जुड़ा हुआ है, या 'प्राथमिकजोइन' अभिव्यक्ति निर्दिष्ट करें। – Rookie

उत्तर

1

मैं के साथ बेहतर किस्मत थी:

Column('user_id', Integer, ForeignKey('users.user_id')), 

मैं भी थोड़ा मेज और मानचित्रण कोड पुनर्क्रमित:

users = Table('users', metadata, 
    Column('user_id', Integer, primary_key=True), 
    Column('name', String(40)), 
    Column('age', Integer)) 

emails = Table('emails', metadata, 
    Column('email_id', Integer, primary_key=True), 
    Column('address', String), 
    # foreign key to table users 
    Column('user_id', Integer, ForeignKey('users.user_id'))) 

mapper(Email, emails) 

mapper(User, users, properties={ 
    'Email': relationship(
     Email, primaryjoin=users.c.user_id==emails.c.user_id)})