如何基于已完成关联查询的子查询执行再次关联操作?
问题:复用已关联子查询进行多表关联时出错
现有查询语句
subquery = select(table1.c.id, table1.c.type, table1.c.some_category, table2.c.some_other_category).join(table2, table1.c.id == table2.c.id)
尝试关联第三张表的代码
# Fetch data another_query = session.query(table3.c.id, table3.c.aa, table3.c.bb, table3.c.cc, table3.c.dd).subquery() join = select(another_query.c.id, another_query.c.aa).join(subquery, another_query.c.id == subquery.c.id) result = session.execute(join).fetchmany(1000)
报错信息
Join target, typically a FROM expression, or ORM relationship attribute expected, got <sqlalchemy.sql.selectable.Select object.
解决方法
报错原因是你定义的subquery本质还是一个Select对象,并非可用于关联的子查询(Subquery)。SQLAlchemy的join方法要求关联目标是FROM表达式(比如子查询、表对象),所以需要将原有查询转换为子查询。
修改方式1:定义原有查询时直接转为子查询
# 原有查询直接调用.subquery()转为子查询 subquery = select(table1.c.id, table1.c.type, table1.c.some_category, table2.c.some_other_category).join(table2, table1.c.id == table2.c.id).subquery() # 后续关联代码保持不变 another_query = session.query(table3.c.id, table3.c.aa, table3.c.bb, table3.c.cc, table3.c.dd).subquery() join = select(another_query.c.id, another_query.c.aa).join(subquery, another_query.c.id == subquery.c.id) result = session.execute(join).fetchmany(1000)
修改方式2:在关联时临时转换
如果不想修改原有subquery的定义,可以在join时调用.subquery():
join = select(another_query.c.id, another_query.c.aa).join(subquery.subquery(), another_query.c.id == subquery.subquery().c.id)
推荐第一种方式,代码更简洁易读。
内容的提问来源于stack exchange,提问作者Ipsider
相关产品推荐
相关产品推荐

