我有以下课程:
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))
)
用语言来说,我试图用给定B指向的所有A中最大的maximum_a
创建一个a_id
的关系。我特别希望这是一个关系,以便我可以用joinedload
预取它,以避免我们现在有O(N)查询的情况。
当我尝试预加载maximum_a
关系时(例如通过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.
我已尝试阅读有关关联的SQLA文档,但它们都是根据原始select
而不是ORM调用编写的,并且描述不是很清楚,所以我和#39;我不知道在哪里添加correlate
电话 - 或者是否有更好的方法来执行此操作。
有什么建议吗?谢谢!
答案 0 :(得分: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)