如何过滤查询的计算列并同时保留映射的实体
How to filter on calculated column of a query and meanwhile preserve mapped entities
我有一个查询,其中 select 是实体 A 和一些计算字段
q = session.query(Recipe,func.avg(Recipe.somefield).join(.....)
然后我使用我 select 的方式假设我可以用 "Recipe" 字符串下标结果:
for entry in q.all():
recipe=entry.Recipe # Access KeyedTuple by Recipe attribute
...
现在我需要将我的查询包装在一个额外的 select 中,比如按计算字段 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()`?
我尝试使用那些但出现错误
正如 Michael Bayer 在相关的 Google 组帖子中提到的那样,这种适应已经通过 Query.from_self()
方法完成。我的问题是,在这种情况下,我不知道如何引用我想过滤的列
这是因为计算出来的,没有table可以参考!
我可能会求助于使用文字(.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)
我有一个查询,其中 select 是实体 A 和一些计算字段
q = session.query(Recipe,func.avg(Recipe.somefield).join(.....)
然后我使用我 select 的方式假设我可以用 "Recipe" 字符串下标结果:
for entry in q.all():
recipe=entry.Recipe # Access KeyedTuple by Recipe attribute
...
现在我需要将我的查询包装在一个额外的 select 中,比如按计算字段 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()`?
我尝试使用那些但出现错误
正如 Michael Bayer 在相关的 Google 组帖子中提到的那样,这种适应已经通过 Query.from_self()
方法完成。我的问题是,在这种情况下,我不知道如何引用我想过滤的列
这是因为计算出来的,没有table可以参考!
我可能会求助于使用文字(.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)