2

我将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

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

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

任何知道如何将query_property与 group_by 和 count 一起使用的人?

4

2 回答 2

8

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

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

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

[(<Person object>, 3), (<Person object>, 7), ...]
于 2012-11-08T18:31:01.483 回答
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()
    ....
于 2011-11-26T00:02:39.697 回答