sqlalchemy通过关联代理连接多个条件

时间:2013-08-08 15:19:46

标签: python sqlalchemy

我有三个结构,在它们之间的每个可能的关系点都有数据(称为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:无法确定在连接对象上的连接对象上的连接对象,连接对象上的连接对象(163066988)和一个(162822028)(175636236)和交流(162854924)(2936229868)和c( 161105164)(2936272780)'和'abc';表之间有多个外键约束关系。请明确指定此联接的“onclause”。

1 个答案:

答案 0 :(得分:2)

似乎SQLAlchemy不支持自动加入或通过指定多个连接条件。执行此操作的正确方法是使用其中一个自动连接(例如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()