SQLAlchemy:从子查询返回 ORM 对象

问题描述 投票:0回答:1

我需要连接多个表,然后根据模型 C.id 的分区通过某种规则返回不同的行(为了简单起见,让我们使用

row_number()==1
)。由于它是一个窗口函数,因此不能直接在
where
中使用,因此需要外部查询来过滤。它有效,但它将模型移动到子查询中,Alchemy 现在返回原始行,而不是模型对象
:(
GPT 建议使用
with_entities
add_entity
但他们似乎添加了重复的
from
提取,完整笛卡尔积打破了逻辑,而不是对现有列进行简单解析。我怎样才能实现它?

# Main query
subq = db.query(ModelA, ModelB, ModelC)
subq = subq.filter(ModelA.some_tag == ModelB.some_tag)
subq = subq.filter(ModelA.some_tag == ModelC.some_tag)
subq = subq.filter(ModelA.some_tag == "31415926535")  # just to simplify testing

# Additional field by a window function
partition_col = func.row_number().over(partition_by=ModelC.id).label("partition_col_name")
subq = subq.add_column(partition_col)

# Outer query
subq = subq.subquery()
q = db.query(subq).filter(subq.c["partition_col_name"] == 1)
python sqlalchemy orm window-functions
1个回答
0
投票

您可以通过将查询放在 from_statement 调用中来完成此操作,该调用是从查询模型的查询中调用的:

qq = db.query(ModelA, ModelB, ModelC).from_statement(q)
© www.soinside.com 2019 - 2024. All rights reserved.