我需要连接多个表,然后根据模型 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)
您可以通过将查询放在 from_statement 调用中来完成此操作,该调用是从查询模型的查询中调用的:
qq = db.query(ModelA, ModelB, ModelC).from_statement(q)