我有一个查询,它选择一个实体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()`?
我试过使用那些但是给出了错误
答案 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)