我以this为例帮助我学习sqlalchemy。这是mySQL:
select f.type, f.variety, f.price
from (
select type, min(price) as minprice
from fruits group by type
) as x inner join fruits as f on f.type = x.type and f.price = x.minprice;
这是我到目前为止所做的:
s = Session()
sq = s.query(func.min(fruit.price)).group_by(fruit.type).subquery()
ans = s.query(fruit).join(sq, fruit.price==sq.c.price).all()
但它显然不起作用。我甚至关闭了吗?
我一直在倾注这些docs。 price
是PK,如果这有帮助..也许我需要别名或其他东西。任何帮助或指示都表示赞赏。
答案 0 :(得分:1)
我无法确定这一点,因为我不知道你得到了什么例外。
由于您正试图让SQLAlchemy执行与您发布的查询类似的查询,您的select
子句中有from
语句,因此您需要调用{{ 1}}关于sqlalchemy.select
的结果类似于链接的示例。此映射的类将是您尝试模仿的查询中的mapper
。然后你可以x
来获得最终结果。
相比之下,查询对象的session.query(fruits).join((x, ...)).filter(...
方法适用于您需要a select
statement in the where
clause的情况,如subquery
中所示。使用where column in (select ...)
获取最终生成的查询中的内部选项。然后,您可以创建单独的(外部)查询并加入subquery
调用的结果。要让SQLAlchemy使用类似于您的示例的查询,您似乎不需要使用此技术。
答案 1 :(得分:1)
解决方案:以下应该这样做:
fruit
为Table
个实例时的版本:
q = (select([fruit.c.type, func.min(fruit.c.price).label("min_price")]).
group_by(fruit.c.type)).alias("subq")
s = select([fruit],
and_(fruit.c.type == q.c.type,
fruit.c.price == q.c.min_price)
)
res = session.execute(s)
fruit
为Model
类型时的版本:
q = (select([fruit.type, func.min(fruit.price).label("min_price")]).
group_by(fruit.type)).alias("subq")
s = (session.query(fruit).
join(q, and_(fruit.type==q.c.type, fruit.price == q.c.min_price))
)
res = s.all()
旁注:作为PK的浮动列听起来不是一个好主意......真的,两个不同的水果不能有相同的价格(会违反唯一性)吗?
答案 2 :(得分:0)
这也有效,是我最熟悉的语法。
s = Session()
sq = s.query(func.min(fruit.price).label('min_price').\
group_by(fruit.type).subquery()
ans = s.query(fruit).join(sq, fruit.price==sq.c.min_price).all()