将SQLAlchemy关系与笨拙的连接相关联

Ben*_*uhn 7 python orm sqlalchemy

我有以下课程:

class A:
    a_id = Column(Integer, primary_key=True)
    a_remote = Column(UnicodeText)

class B:
    b_id = Column(Integer, primary_key=True)
    foreign_to_a = Column(UnicodeText)
    maximum_a = relationship(A, primaryjoin=lambda:
      and_(remote(a_remote) == foreign(foreign_to_a),
           A.a_id = select([func.max(A.a_id)]).where(A.a_remote == B.foreign_to_a))
    )
Run Code Online (Sandbox Code Playgroud)

换句话说,我试图创建一个maximum_aa_id给定B指向的所有A中最大的关系.我特别希望这是一个关系,以便我可以预取它joinedload以避免我们现在有O的情况( N)查询.

当我尝试预加载maximum_a关系(例如via session.query(B).options(joinedload('maximum_a')).all())时,我收到以下错误:

sqlalchemy.exc.InvalidRequestError: Select statement 'SELECT max(a_1.a_id) AS max_1
FROM a AS a_1, b
WHERE a_1.a_remote = b.foreign_to_a' returned no FROM clauses due to auto-correlation; specify correlate(<tables>) to control correlation manually.
Run Code Online (Sandbox Code Playgroud)

我曾尝试阅读有关相关的SQLA文档,但它们都是根据原始select而不是ORM调用编写的,描述不是很清楚,所以我不确定在哪里添加correlate调用 - 或者如果有更好的方法来做到这一点.

有什么建议?谢谢!

Ben*_*uhn 6

经过多次尝试,这是有效的:

class A:
    a_id = Column(Integer, primary_key=True)
    a_remote = Column(UnicodeText)

latest_a = select([
    func.max(A.a_id).label('a_id'), A.a_remote
]).group_by(A.a_remote).alias('latest_a')

class B:
    b_id = Column(Integer, primary_key=True)
    foreign_to_a = Column(UnicodeText)
    maximum_a = relationship(A,
        secondary=latest_a,
        primaryjoin=latest_a.c.a_remote == foreign_to_a,
        secondaryjoin=latest_a.c.a_id == A.a_id,
        uselist=False, viewonly=True)
Run Code Online (Sandbox Code Playgroud)