python - Have 子句中的 SQLAlchemy 引用标签

标签 python mysql sqlalchemy

我们有一个查询,我们需要将其用作选择的一部分,并在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/

相关文章:

python - 解析隐式与显式时间运算符

mysql - 仅显示表中的结果,其中其他表中不存在特定的变量组合?

mysql - 查找连续行数设置为零的行。 (MySQL)

python - Sqlalchemy 双关联表?

python - 如何使用 pandas 从 csv 的 2 列中获取重复值的列表

python - 查找用户的 "My Documents"路径

sqlalchemy - celery beat 和 sqlalchemy + pyramid app 出现 "ResourceClosedError: The transaction is closed"错误

python - SQLAlchemy delete() 函数刷新,但不提交,即使在调用 commit() 之后

python - 使用输入值Python从列表中选择最大元素

java - Spring Boot,Spring Security 与数据库链接