如何筛选查询的计算列,同时保留映射的实体

时间:2015-04-25 10:07:53

标签: python sqlalchemy

我有一个查询,它选择一个实体A和一些计算字段

q = session.query(Recipe,func.avg(Recipe.somefield).join(.....)

然后我使用我选择的方式,假设我可以使用“Recipe”字符串下标结果:

for entry in q.all():
   recipe=entry.Recipe # Access KeyedTuple by Recipe attribute
   ...

现在我需要将我的查询包装在另一个选择中,比如按计算字段AVG过滤:

q=q.subquery(); 
q=session.query(q).filter(q.c.avg_1 > 1)

现在我无法访问entry.Recipe了! 有没有办法让SQLAlchemy将查询调整为封闭的查询,如aliased(adapt_on_names=True) or select_from_entity()`? 我试过使用那些但是给出了错误

1 个答案:

答案 0 :(得分:0)

正如Michael Bayer在相关的Google Group主题中提到的那样,这种调整已经通过Query.from_self()方法完成了。我的问题是,在这种情况下,我不知道如何引用我要过滤的列

这是因为它被计算出来,即没有表可供参考!

我可能会使用文字(.filter('avg_1>10')),但更喜欢保留更多的ORM风格

所以,这就是我提出的 - 一个明确的列表达式

row_number_column = func.row_number().over(
    partition_by=Recipe.id
).label('row_number')

query = query.add_column(
    row_number_column
)
query = query.from_self().filter(row_number_column == 1)
相关问题