私は 3 つの構造体を持ち、それらの間の可能な関係点ごとにデータを持っています (それらを a、b、および c と呼びます)。これらの関係を(関連付けられたテーブルで)次のように宣言します...
class A(Base):
__tablename__ = 'a'
id = Column( types.Integer(), primary_key = True )
abs = orm.relation( 'AB' )
acs = orm.relation( 'AC' )
# similarly for b and c
class AB(Base):
__tablename__ = 'ab'
id = Column( types.Integer(), primary_key = True )
a_id = Column( types.Integer(), ForeignKey( 'a.id' ) )
b_id = Column( types.Integer(), ForeignKey( 'b.id' ) )
a = orm.relation( 'A' )
b = orm.relation( 'B' )
abcs = orm.relation( 'ABC' )
acs = association_proxy( 'abcs', 'ac' )
# similarly for ac
class ABC(Base):
__tablename__ = 'abc'
id = Column( types.Integer(), primary_key = True )
ab_id = Column( types.Integer(), ForeignKey( 'ab.id' ) )
ac_id = Column( types.Integer(), ForeignKey( 'ac.id' ) )
ab = orm.relation( 'AB' )
ac = orm.relation( 'AC' )
次のコードは失敗します。
abs = db.session.query( AB ).join( A ).join( AC ).join( C ).join( B ).join( ABC, and_(
ABC.ab_id == AB.id,
ABC.ac_id == AC.id
) ).all()
上記により、次のエラーが発生します。
ArgumentError: 'Join object on Join object on Join object on Join object on Join object on ab(163066988) and a(162822028)(175636236) and ac(162854924)(2936229868) and c(161105164)( 2936272780)」および「abc」; テーブル間に複数の外部キー制約関係があります。この結合の「onclause」を明示的に指定してください。