2011-09-21 22 views
30

का उपयोग कर समग्र कुंजी पर संबंध मेरे पास लेखक - पुस्तकें का यह सरल मॉडल है और पहले नाम बनाने के लिए कोई रास्ता नहीं ढूंढ सकता है और अंतिम नाम एक समग्र कुंजी नाम और संबंध में इसका उपयोग कर सकता है। कोई विचार?sqlalchemy

from sqlalchemy import create_engine, ForeignKey, Column, String, Integer 
from sqlalchemy.orm import relationship, sessionmaker 
from sqlalchemy.ext.declarative import declarative_base 

Base = declarative_base() 
engine = create_engine('mssql://user:[email protected]') 
engine.echo = True 
session = sessionmaker(engine)() 

class Author(Base): 
    __tablename__ = 'authors' 
    firstName = Column(String(20), primary_key=True) 
    lastName = Column(String(20), primary_key=True) 
    books = relationship('Book', backref='author') 

class Book(Base): 
    __tablename__ = 'books' 
    title = Column(String(20), primary_key=True) 
    author_firstName = Column(String(20), ForeignKey('authors.firstName')) 
    author_lastName = Column(String(20), ForeignKey('authors.lastName'))    

उत्तर

52

समस्या यह है कि आप निश्चित रूप से अलग से विदेशी कुंजी के रूप में निर्भर स्तंभों में से प्रत्येक को परिभाषित किया है, जब कि वास्तव में नहीं है जिसकी आपको करना चाहते हैं, आप एक समग्र विदेशी कुंजी चाहते हैं। Sqlalchemy यह कहकर जवाब दे रहा है (एक बहुत स्पष्ट तरीके से नहीं), यह अनुमान नहीं लगा सकता कि किस विदेशी कुंजी का उपयोग करना है (firstName या lastName)।

समाधान, एक समग्र विदेशी कुंजी घोषित करने, कथात्मक में एक बालक भद्दा, लेकिन अभी भी काफी स्पष्ट है:

class Book(Base): 
    __tablename__ = 'books' 
    title = Column(String(20), primary_key=True) 
    author_firstName = Column(String(20)) 
    author_lastName = Column(String(20)) 
    __table_args__ = (ForeignKeyConstraint([author_firstName, author_lastName], 
              [Author.firstName, Author.lastName]), 
         {}) 

यहां महत्वपूर्ण बात यह है कि ForeignKey परिभाषाओं अलग-अलग स्तंभों से चले गए हैं, और एक ForeignKeyConstraint को __table_args__ क्लास चर में जोड़ा गया है। इसके साथ, relationshipAuthor.books पर परिभाषित सही काम करता है।

+2

[डॉक्स] (http://docs.sqlalchemy.org/en/rel_0_9/core/constraints.html?highlight=check#metadata-foreignkeys) में अतिरिक्त स्पष्टीकरण और उदाहरण शामिल हैं: यह ध्यान रखना महत्वपूर्ण है कि 'ForeignKeyConstraint एक समग्र विदेशी कुंजी को परिभाषित करने का एकमात्र तरीका है। जबकि हम दोनों [...] कॉलम पर अलग-अलग 'विदेशीकी' ऑब्जेक्ट्स भी रख सकते थे, एसक्यूएलकेमी को पता नहीं होगा कि इन दो मानों को एकसाथ जोड़ा जाना चाहिए - यह एक समग्र विदेशी कुंजी संदर्भ के बजाय दो अलग-अलग विदेशी कुंजी बाधाएं होगी दो कॉलम – iled