2017-11-29 2 views
0

Ich habe folgendes Szenario:SQLAlchemy Beziehung mit selbstbezüglicher sekundären

class A(Base): 
    a_string = Column(String) 

class B(Base): 
    id = Column(Integer, primary_key=True) 

class C(Base): 
    b_id = Column(Integer, ForeignKey(B.id)) 
    value = Column(String) 

Ich brauche die folgende Abfrage zu tun:

SELECT c2.* 
    FROM a 
    JOIN c c1 on c1.value = a.a_string 
    JOIN c c2 on c2.b_id = c1.b_id 

Das Problem ist, dass ich die Abfrage oben tun müssen, in eine Beziehung im Inneren des Modells A. Etwas wie:

class A(Base): 
    a_string = Column(String) 
    c_list = relationship('C', secondary=...) 

Antwort

1

Sie benötigen einen Alias ​​für C, um sel f beitreten:

In [3]: c_to_c = aliased(C.__table__) 

Damit können Sie dann die primäre definieren und sekundären schließt sich an Ihre Bedürfnisse anzupassen. Diese Beziehung sollte wohl nur ansehen zu:

In [4]: A.c_list = relationship(
    ...:  C, secondary=c_to_c, 
    ...:  primaryjoin=A.a_string == c_to_c.c.value, 
    ...:  secondaryjoin=C.b_id == c_to_c.c.b_id, 
    ...:  viewonly=True 
    ...:) 

Anschließend können Sie überprüfen, ob Sie können zum Beispiel den Einsatz eager loading verbunden:

In [5]: print(session.query(A).options(joinedload(A.c_list))) 
SELECT a.id AS a_id, a.a_string AS a_a_string, c_1.id AS c_1_id, c_1.b_id AS c_1_b_id, c_1.value AS c_1_value 
FROM a LEFT OUTER JOIN (c AS c_2 JOIN c AS c_1 ON c_1.b_id = c_2.b_id) ON a.a_string = c_2.value 
Verwandte Themen