gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:45:26 24 4
gpt4 key购买 nike

我有以下类(class):

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))
)

换句话说,我正在尝试创建一个 maximum_a 与给定 B 指向的所有 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 调用编写的,并且描述不是很清楚,所以我我不确定在哪里添加 correlate 调用——或者是否有更好的方法来执行此操作。

有什么建议吗?谢谢!

最佳答案

经过多次尝试,以下是有效的方法:

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)

关于python - 将 SQLAlchemy 关系与笨拙的连接相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40614651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com