【问题标题】:How to use avg and sum in SQLAlchemy query如何在 SQLAlchemy 查询中使用 avg 和 sum
【发布时间】:2011-10-31 21:01:46
【问题描述】:

我正在尝试从我的数据集中返回总计/平均值行,其中包含某些字段的 SUM 和其他字段的 AVG。

我可以通过以下方式在 SQL 中执行此操作:

SELECT SUM(field1) as SumFld, AVG(field2) as AvgFld 
FROM Rating WHERE url=[url_string]

我尝试将其转换为 SQLAlchemy 如下:

totals = Rating.query(func.avg(Rating.field2)).filter(Rating.url==url_string.netloc)

但这是错误的:

TypeError: 'BaseQuery' object is not callable

【问题讨论】:

    标签: python sqlalchemy flask flask-sqlalchemy


    【解决方案1】:

    你应该使用类似的东西:

    from sqlalchemy.sql import func
    session.query(func.avg(Rating.field2).label('average')).filter(Rating.url==url_string.netloc)
    

    你不能在这里使用MyObject.query,因为SqlAlchemy试图找到一个字段来存放avg函数的结果,它失败了。

    【讨论】:

    • 谢谢,我感觉应该使用session,但不明白为什么。现在我明白了,谢谢你的帮助,它现在运行良好。
    • 我觉得最好提一下,你必须导入from sqlalchemy.sql import func
    • session.query 如何理解它必须在 Rating Table 中运行此查询?
    • @ted: Rating 在上面的例子中被定义在两个地方:1)在func.avg()和2)在filter()
    【解决方案2】:

    你不能在这里使用 MyObject.query,因为 SqlAlchemy 试图找到一个字段来放置 avg 函数的结果,但它失败了。

    这并不完全正确。 func.avg(Rating.field2).label('average') 返回一个 Column 对象(与精确给出的对象类型相同)。所以你可以将它与查询对象的with_entities 方法一起使用。

    这就是你将如何为你的例子做的:

    Rating.query.with_entities(func.avg(Rating.field2).label('average')).filter(Rating.url == url_string.netloc)
    

    【讨论】:

    • 这是正确的答案,因为flask-sqlalchemy会
    【解决方案3】:
    attention = Attention_scores.query
        .with_entities(func.avg(Attention_scores.score))
        .filter(classroom_number == classroom_number)
        .all()
    

    我试过这样,它给出了正确的平均值。

    【讨论】:

    • 请编辑您的问题以添加正确的格式,另外,请描述您的答案为什么有效?出了什么问题?请在how do I format my post? 上查看我们的指南。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 2021-01-11
    • 2015-05-29
    • 1970-01-01
    相关资源
    最近更新 更多