Have子句中的SQLAlchemy参考标签

时间:2018-08-10 20:31:28

标签: python mysql sqlalchemy

我们有一个查询,需要将它用作select的一部分,也需要在hading子句中使用。问题是,当我希望在having子句中不扩展查询时,生成的SQL会在两个地方都扩展查询。

这是一个复杂的查询,其中包含许多模型,在这里我无法显示,但是想法很简单。

Query(Model.name, subQuery.label('total')) \
    .filter(Model.country == some_country) \
    -group_by(Model.skill) \
    -having(subQuery > some_total)

我们实际上可以在不使用原始SQL扩展子查询的情况下使查询正常工作,但是我们似乎找不到一种用orm重现子查询的方法。

我们希望Have子句的sql看起来像

HAVING total > some_total

但是我们在having子句中再次从subQuery中获得整个选择。

我尝试过

having(subQuery.subquery() > some_total)
having(subQuery.as_scalar() > some_total)

在我们的例子中,原始SQL和orm这类查询之间的性能差异很大,因此在两个地方都执行subQuery并不是一个选择。

1 个答案:

答案 0 :(得分:0)

因此,看来用literal_column引用标签可以解决此问题。请记住,这仅适用于MySQL

Query(Model.name, subQuery.label('total')) \
    .filter(Model.country == some_country) \
    -group_by(Model.skill) \
    -having(literal_column('total') > some_total)