我们有一个查询,需要将它用作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并不是一个选择。
答案 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)