Python SQLAlchemy标签用法

42

我知道可以使用label方法来创建别名,但是我不知道如何在查询中后续使用已经起好别名的元素 - 例如下面的查询:

session.query(Foo.bar.label("foobar")).filter(foobar > 10).all()

当然,这行不通,因为没有名为foobar的变量。那么怎么实现呢?

(这个过于简化的例子只是为了易于理解...)

4个回答

60

我的第一反应是你可以将标记列本身用作表达式:

foobar = Foo.bar.label("foobar")
session.query(foobar).filter(foobar > 10).all()

31

只需将 foobar 用引号括起来。对于 order_by,它会像这样工作:

session.query(Foo.bar.label("foobar")).order_by('foobar').all()

你可以使用原始SQL条件来筛选:

session.query(Foo.bar.label("foobar")).filter("foobar > 10").all()

1
把筛选条件放入原始 SQL 中怎么样?我已经更新了答案。希望有所帮助。 - alecxe
1
虽然这可能有效(我没有尝试过),但我的谓词包括日期,而在某些数据库中,它们与字符串不兼容。 - Ofir
3
当我使用func.sum时,这对我有效,而@Eevee的回答则不行。 - bcoughlan
2
有没有任何想法,如何根据一个带标签的字段更改排序顺序?当尝试使用 query = query.order_by("changepct".asc()) 时会出现错误。 - raven
3
@raven 你可以这样使用 'order_by(desc("quantity"))'。 - Karthikeyan Balusamy

2
# When you use the SQLAlchemy Core interface you may apply text()
from sqlalchemy import text
stmt = select(Foo.c.bar.label("foobar"))
stmt = stmt.where(text("foobar > 10"))

0

想要补充一下@Eevee的回答:

这个方法也可以类似地用于 func.coalesce() 的调用。您可以将 func.coalesce() 的结果赋值给一个变量,然后在过滤器中引用该变量。例如:

x = func.coalesce(Order.x, Order.y)
y = query(<model>).filter(x = 10)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接