Python 我如何在sqlalchemy中连接两个关于公共关系的查询?

Python 我如何在sqlalchemy中连接两个关于公共关系的查询?,python,join,sqlalchemy,relationship,Python,Join,Sqlalchemy,Relationship,假设我有两个类ChildA和ChildB,它们都与Parent有关系。 假设我已经定义了两个查询,qa和qb,它们查询各自的子类。 我想在拥有相同的父项后,将qb加入qa 如果parent只是一个普通列,我可以执行以下操作: subquery = qb.subquery() joined_query = qa.join(subquery, AliasedChildA.parent==subquery.columns.parent) 这里,AliasedChildA是ChildA的别名。(我可以

假设我有两个类
ChildA
ChildB
,它们都与
Parent
有关系。 假设我已经定义了两个查询,
qa
qb
,它们查询各自的子类。 我想在拥有相同的
父项后,将
qb
加入
qa

如果
parent
只是一个普通列,我可以执行以下操作:

subquery = qb.subquery()
joined_query = qa.join(subquery, AliasedChildA.parent==subquery.columns.parent)
这里,
AliasedChildA
ChildA
的别名。(我可以完全控制查询的创建方式,但不能控制稍后应用于查询的过滤器。) 但是现在,由于
parent
是一种关系,它不包含在
子查询.columns


如果有相同的
父项
,我如何加入
qa
qb

别名childa.parent\u id==subquery.c.parent\u id
如果你有一个复合主键,可以加入一些子句)。

尝试以下方法:

qa = session.query(ChildA)
qb = session.query(ChildB)
# @note: *qa* and *qb* may include other filters etc, 
# but assuming they do not contain joins on *Parent*
subquery = qb.subquery()
qry = qa.join(Parent).join(subquery)

对我有效:)

这是我目前正在尝试的解决方法。然而,这依赖于建立在
parent\u id
上的关系,通常我无法控制列的名称,只能控制关系的名称。我能找出哪个列用于建立关系吗?另外,最后我想对类似于
parent1.children==parent2.children
的内容执行一个
join
,我不知道怎么做。你可以从orm类(class.attribute.property.column)中进行一些内省,但不能从子查询的起点开始。使用嵌入式IPython查看可以内省的内容。可以将SQLAlchemy字段作为参数直接传递给函数。my_join_函数(Model1.xxx,Model2.yyy)您可以传递字符串并使用getattr(model,field_name)。我不建议为了找到匹配的字段名而疯狂地自省。这好像是代码的味道。这是个好主意。我唯一的问题是,我事先不知道映射关系的是哪个类
Parent
。也许我应该研究如何通过内省来收集这些信息。(也许我应该尝试解决更简单/更自然的问题…)只要每个
孩子A/B
家长
只有一个关系,它就应该有效。否则,您应该知道您的需求所需的关系:
。在拥有相同的父项时
query_a.subquery().join(query_b.subquery(), $on_condition...)