2013-02-14 9 views
9

point_type sütununa sahip pbx_point adında bir üst tablom var. Ayrıcaadında bir alt tablonuz var,adlı bir sütunda pbx_point'a dönüyoruz.sqlalchemy'de, alt tablonun üst tablasına birden çok yabancı anahtarı olduğunda polimorfik birleşik tablo mirasını nasıl kullanabilirim?

Ben Bu iyi çalışır polimorfik miras

bildirim baz yoluyla bu iki tablo ilgilidir ve kullanımı sqlalchemy en katılmış tablo devralma kullanmak istiyorum -, ederdi, doğrusu ya aşağıdaki ek kısıtlama için değilse: pbx_point Ayrıca, pbx_route işaret eden initial_route_id adlı bir yabancı anahtar vardır.

Aşağıdaki yansımayı da kullanıyorum ama db yukarıda açıkladığım gibidir. Aldığım hata 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..

Bu, "sahnelerin ardında" delişimli temel olarak, eşlenmiş sınıfların her ikisinde de bir ilişki() özniteliği oluşturduğundan anlam ifade eder. Parent_id bağlantısı olarak pbx_route.point_id'u seçmeyi tercih ediyorum, ancak pbx_point.initial_route_id sütununu da görüyor. Bu ilişkiyi oluşturuyor olsaydım, düzeltmek kolay olurdu(), ama ben değilim - bildirimsel miras sistemi. beni arzu yabancı anahtar belirtmek izin verirdim polymorphic_parent_col gibi

Ben __mapper_args__ geçirebilirsiniz bir ek argüman var mı

? Değilse, bu konuda nasıl çalışabilirim?

Teşekkürler.

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. 

o https://bitbucket.org/sqlalchemy/sqlalchemy/src/7f3494ebad58/lib/sqlalchemy/orm/mapper.py?at=default#cl-517 ölen gösterir:

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') 

Bu

alıyorum yığın izidir. Ihtiyacım olan şey gibi görünen, mapper kwarg inherit_condition için referance yapar yukarıdaki birkaç satır.

cevap

10

Anahtar, eşleştiriciye ait inherit_condition bağımsız değişkenidir. Polimorfik bilgilerin aslında bu adımla ilgisi yoktur.

Düzeltilmiş modeller:

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) 
    ) 

ben inherit_condition argüman bunları kullanmak için id ve point_id sütunları eklemek gerekiyordu. Bunu yalnızca yansımayı kullanarak yapmanın bir yolu olması muhtemeldir, ancak bu korkunç bir engel değildir.

+1

Tam olarak bu sorunu yaşadım ve dokümanlarda bulamadım. Cevap için teşekkürler. –

İlgili konular