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