我们有一个查询,我们需要将其用作选择的一部分,并在having 子句中使用。问题是,当我希望不在having子句中扩展查询时,生成的SQL在两个地方扩展了查询。
这是一个包含大量模型的复杂查询,我无法在此处显示,但想法很简单。
Query(Model.name, subQuery.label('total')) \
.filter(Model.country == some_country) \
-group_by(Model.skill) \
-having(subQuery > some_total)
我们实际上可以在不使用原始 SQL 扩展子查询的情况下使查询工作,但我们似乎无法找到使用 orm 重现该查询的方法。
我们期望having子句的sql看起来像
HAVING total > some_total
但是我们在having子句中再次从子查询中获得整个选择。
我已经尝试过
having(subQuery.subquery() > some_total)
having(subQuery.as_scalar() > some_total)
在我们的例子中,原始 SQL 和类似 orm 的查询之间的性能差异很大,因此在两个地方都执行子查询并不是一个真正的选择。
最佳答案
所以看起来用 literal_column
引用标签可以解决这个问题。请记住,这仅适用于 MySQL
Query(Model.name, subQuery.label('total')) \
.filter(Model.country == some_country) \
-group_by(Model.skill) \
-having(literal_column('total') > some_total)
关于python - Have 子句中的 SQLAlchemy 引用标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51793704/