2013-02-14 17 views
9

मेरे पास pbx_point नामक एक मूल तालिका है जिसमें point_type कॉलम है। मेरे पास pbx_route नामक एक बाल तालिका भी है, जिसे point_id नामक कॉलम के साथ pbx_point पर इंगित किया गया है।sqlalchemy में, मैं पॉलिमॉर्फिक तालिका तालिका विरासत का उपयोग कैसे कर सकता हूं जब बच्चे की तालिका में मूल तालिका में एकाधिक विदेशी कुंजी होती है?

मैं SQLAlchemy के शामिल हो गए तालिका विरासत का उपयोग करने के कथात्मक आधार के माध्यम से इन दो तालिकाओं संबंधित हैं, और प्रयोग बहुरूपी विरासत

यह ठीक काम करता है करना चाहते हैं -, यह होगा, बल्कि या यदि निम्न अतिरिक्त बाधा के लिए नहीं: pbx_pointinitial_route_id नामक एक विदेशी कुंजी भी है जिसे pbx_route पर इंगित किया गया है।

मैं नीचे प्रतिबिंब का उपयोग भी कर रहा हूं, लेकिन डीबी जैसा मैंने ऊपर वर्णित किया है। मुझे मिली त्रुटि sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'pbx_point' and 'pbx_route'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly. है।

यह समझ में आता है, "दृश्यों के पीछे" delcarative आधार मैप किए गए वर्गों पर एक रिश्ते() विशेषता बना रहा है। मैं इसे pbx_route.point_id को parent_id लिंक के रूप में चुनना चाहता हूं, लेकिन यह pbx_point.initial_route_id कॉलम भी देखता है। यह ठीक करना आसान होगा, अगर मैं यह रिश्ता बना रहा था(), लेकिन मैं नहीं हूं - घोषणात्मक विरासत प्रणाली है।

क्या कोई अतिरिक्त तर्क है कि मैं __mapper_args__ पर जा सकता हूं, जैसे polymorphic_parent_col जो मुझे अपनी इच्छित विदेशी कुंजी निर्दिष्ट करने देगी? यदि नहीं, तो मैं इस मुद्दे के आसपास कैसे काम कर सकता हूं?

धन्यवाद।

Traceback (most recent call last): 
    File "db.py", line 50, in <module> 
    Base.prepare(engine) 
    File "env/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/api.py", line 431, in prepare 
    thingy.map() 
    File "env/local/lib/python2.7/site-packages/sqlalchemy/ext/declarative/base.py", line 379, in map 
    **mapper_args 
    File "env/local/lib/python2.7/site-packages/sqlalchemy/orm/__init__.py", line 1147, in mapper 
    return Mapper(class_, local_table, *args, **params) 
    File "env/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 213, in __init__ 
    self._configure_inheritance() 
    File "env/local/lib/python2.7/site-packages/sqlalchemy/orm/mapper.py", line 517, in _configure_inheritance 
    self.local_table) 
    File "env/local/lib/python2.7/site-packages/sqlalchemy/sql/util.py", line 397, in join_condition 
    "join explicitly." % (a.description, b.description)) 
sqlalchemy.exc.AmbiguousForeignKeysError: Can't determine join between 'pbx_point' and 'pbx_route'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly. 

जो इंगित करता है यह https://bitbucket.org/sqlalchemy/sqlalchemy/src/7f3494ebad58/lib/sqlalchemy/orm/mapper.py?at=default#cl-517 पर मर रहा है:

class MyBase(DeferredReflection): 
    @declared_attr 
    def __tablename__(cls): 
     return cls.__name__.lower() 

Base = declarative_base(cls=MyBase) 

class pbx_point(Base): 
    __mapper_args__ = dict(
     polymorphic_on='point_type', 
     with_polymorphic='*', 
    ) 

class pbx_route(pbx_point): 
    __mapper_args__ = dict(polymorphic_identity='pbx.route') 

यह स्टैक ट्रेस मैं हो रही है। इससे ऊपर की कुछ पंक्तियां मैपर kwarg inherit_condition को संदर्भित करती हैं, जो मुझे चाहिए।

उत्तर

10

कुंजी inherit_condition मैपर के लिए तर्क है। पॉलिमॉर्फिक जानकारी वास्तव में इस चरण के साथ कुछ भी करने के लिए नहीं है।

सही मॉडल:

class MyBase(DeferredReflection): 
    @declared_attr 
    def __tablename__(cls): 
     return cls.__name__.lower() 

Base = declarative_base(cls=MyBase) 

class pbx_point(Base): 
    __mapper_args__ = dict(
     polymorphic_on='point_type', 
     with_polymorphic='*', 
    ) 
    id = Column(Integer, primary_key=True) 

class pbx_route(pbx_point): 
    point_id = Column(Integer, ForeignKey(pbx_point.id)) 
    __mapper_args__ = dict(
     polymorphic_identity='pbx.route', 
     inherit_condition=(point_id == pbx_point.id) 
    ) 

मैं उन्हें inherit_condition तर्क में उपयोग करने के लिए id और point_id स्तंभ जोड़ने की जरूरत है। प्रतिबिंब का उपयोग करके ऐसा करने का एक तरीका होने की संभावना है, लेकिन यह एक भयानक बाधा नहीं है।

+1

मुझे यह सही समस्या थी और इसे दस्तावेज़ों में नहीं मिला। जवाब के लिए धन्यवाद। –

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