sqlalchemy group_by and count

sqlalchemy group_by and count,sqlalchemy,flask-sqlalchemy,Sqlalchemy,Flask Sqlalchemy,我使用flask作为带有sqlalchemy的python框架。模型使用query_属性帮助我生成查询: class Person(object): query = db_session.query_property() .... persons = Person.query.all() 每个人都有自己居住的城市、州和国家,我想收集所有结果并输出如下内容: Country State City Persons(coun

我使用flask作为带有sqlalchemy的python框架。模型使用query_属性帮助我生成查询:

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()

有人知道如何使用group_by和count吗?

你是对的-你不能使用
query_属性
,因为它会隐式选择整个对象(它的所有属性),因此,通过添加
组将不会产生所需的结果,因为查询的非聚合部分中包含了不需要的列

但是,您只需使用
db\u session.query([Person.country,…]).group\u by(…)
。因此,您只需将
db\u session
属性与
query
一起添加到
Person
类中,然后使用它明确地创建所需的查询:

class Person(object):
    session = db_session
    query = db_session.query_property()
    ....
您可以使用
Person.query
上的方法附加计算值:

Person.query.add_columns(func.count(...)).group_by(...).all()
请记住,返回的是元组列表(而不是Person对象)。但是,每个元组包含Person对象和计算值:

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