0

私は 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」を明示的に指定してください。

4

1 に答える 1

2

SQLAlchemy は、この種の自動または複数の結合条件の指定による結合をサポートしていないようです。これを行う正しい方法は、自動結合の 1 つ (例: AB.abcs) を使用し、他の条件をフィルターとして指定することです。

abs = db.session.query( AB ).join( AB.a ).join( A.acs ).join( AC.c )\
    .join( AB.b ).join( AB.abcs ).filter( ABC.ac_id = AC.id ).all()
于 2013-09-13T16:59:25.413 に答える