我知道可以使用label方法来创建别名,但是我不知道如何在查询中后续使用已经起好别名的元素 - 例如下面的查询:
session.query(Foo.bar.label("foobar")).filter(foobar > 10).all()
当然,这行不通,因为没有名为foobar的变量。那么怎么实现呢?
(这个过于简化的例子只是为了易于理解...)
我知道可以使用label方法来创建别名,但是我不知道如何在查询中后续使用已经起好别名的元素 - 例如下面的查询:
session.query(Foo.bar.label("foobar")).filter(foobar > 10).all()
当然,这行不通,因为没有名为foobar的变量。那么怎么实现呢?
(这个过于简化的例子只是为了易于理解...)
我的第一反应是你可以将标记列本身用作表达式:
foobar = Foo.bar.label("foobar")
session.query(foobar).filter(foobar > 10).all()
只需将 foobar 用引号括起来。对于 order_by
,它会像这样工作:
session.query(Foo.bar.label("foobar")).order_by('foobar').all()
你可以使用原始SQL条件来筛选:
session.query(Foo.bar.label("foobar")).filter("foobar > 10").all()
# 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"))
想要补充一下@Eevee的回答:
这个方法也可以类似地用于 func.coalesce() 的调用。您可以将 func.coalesce()
的结果赋值给一个变量,然后在过滤器中引用该变量。例如:
x = func.coalesce(Order.x, Order.y)
y = query(<model>).filter(x = 10)
func.sum
时,这对我有效,而@Eevee的回答则不行。 - bcoughlanquery = query.order_by("changepct".asc())
时会出现错误。 - raven