sqlalchemy group_by和count

时间:2011-11-25 20:48:09

标签: sqlalchemy flask-sqlalchemy

我正在使用flask作为带有sqlalchemy的python框架。模型使用query_property来帮助我构建查询:

class Person(object):
        query = db_session.query_property()
        ....

persons = Person.query.all()

每个人都有他居住的城市,州和国家,我想收集所有结果并输出如下内容:

    Country     State       City        Persons(count)
================================================================================
    US      NY      New York    10
    DE      Berlin      Berlin      100

这显然需要按国家,州,城市选择计数和分组。 group by thing有效但我不知道如何实现计数,因为查询属性没有select方法,在这种情况下我会写:

Person.query.select([Person.country, Person.state, Person.city, func.count(Person.id)]).all()

任何想知道如何将query_property与group_by和count?

一起使用的人

2 个答案:

答案 0 :(得分:7)

您可以使用Person.query上的add_columns方法附加计算值:

Person.query.add_columns(func.count(...)).group_by(...).all()

请记住,您将返回元组列表(而不是Person对象)。但是,每个元组都包含Person对象和计算值:

[(<Person object>, 3), (<Person object>, 7), ...]

答案 1 :(得分:2)

你是对的 - 你不能使用query_property来执行它,因为它隐含地选择整个对象(它的所有属性),因此添加group_by将不会产生所需的结果,因为包含了不需要的列在查询的非聚合部分。

但是,您只需使用db_session.query([Person.country, ...]).group_by(...)即可。因此,您需要做的就是将db_session属性与Person一起添加到query类,然后使用它来明确地创建所需的查询:

class Person(object):
    session = db_session
    query = db_session.query_property()
    ....