【问题标题】:SQLAlchemy Query with multiple filtered aggregates具有多个过滤聚合的 SQLAlchemy 查询
【发布时间】:2018-12-17 01:06:38
【问题描述】:

假设我们有一个 mysql 数据透视查询(取自对数据透视表问题的回答 MySQL pivot table) 带有内部连接。

select projects.org,  SUM(ivt_incidents.severity = 'SEV3') as 
sev3_count, 
SUM(ivt_incidents.severity = 'SEV2') as sev2_count, 
SUM(ivt_incidents.severity = 'SEV1') as sev1_count, 
SUM(ivt_incidents.severity = 'SEV0') as sev0_count, 
SUM(ivt_incidents.severity like '%SEV%') as total_count  from 
ivt_incidents inner join projects on ivt_incidents.jira_key = 
projects.jira_key group by projects.org order by total_count;

在构建 sqlalchemy 查询方面寻求帮助:

response = db.session.query(
        func.sum(Incidents.severity).filter(Incidents.severity == 'SEV3'),
        Projects.org).\
    join(Projects, Projects.jira_key == Incidents.jira_key).\
    group_by(Projects.org)

如果我运行它,它将接受查询,但是如果我调用

response.all()

ProgrammingError: (mysql.connector.errors.ProgrammingError) 1064 (42000): 你的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '(WHERE ivt_incidents.severity = 'SEV3') AS anon_1, projects.org AS projects_org ' 附近使用正确的语法 [SQL: u'SELECT sum(ivt_incidents.严重性)过滤器(其中 ivt_incidents.severity = %(severity_1)s)AS anon_1,projects.org AS projects_org \nFROM ivt_incidents INNER JOIN 项目 ON projects.jira_key = ivt_incidents.jira_key GROUP BY projects.org'] [参数:{u'严重性_1':'SEV3'}](此错误的背景:http://sqlalche.me/e/f405

【问题讨论】:

  • .filter子句调用Incidents.severity
  • 哇!什么错字:) 感谢您的回复!
  • db.session.query(func.count(Incidents.severity),Incidents.severity, Projects.org).filter(Incidents.severity.in_(['SEV2','SEV3',' SEV1','SEV0',''])).join(Projects, Projects.jira_key == Incidents.jira_key).group_by(Projects.org, Incidents.severity) 给了我想要的结果。

标签: python mysql sqlalchemy


【解决方案1】:

MySQL 不支持✝️您尝试在 func.sum(...).filter(...) 中使用的 SQL 标准 aggregate FILTER clause,它被编译为

SUM(...) FILTER (WHERE ...)

查看您的原始查询,您应该将谓词表达式作为 SUM 的参数传递:

response = db.session.query(
        func.sum(Incidents.severity == 'SEV3'),
        Projects.org).\
    join(Projects, Projects.jira_key == Incidents.jira_key).\
    group_by(Projects.org)

只有在调用Query.all() 后才会出现错误的原因是,查询实际上是发送到数据库的。在此之前,您刚刚构建了一个 Query 对象。

✝️:有一个plugin通过重写查询为 MySQL 添加 FILTER 支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2016-03-24
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    相关资源
    最近更新 更多