2011-11-25 75 views
2

我使用flask作为python框架和sqlalchemy。该机型采用query_property,帮助我建立查询:sqlalchemy group_by和count

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和计数?

回答

2

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

但是,您可以简单地使用db_session.query([Person.country, ...]).group_by(...)。因此,所有你需要做的是db_session财产与query一起添加到Person类,然后用它来创建明确地所需的查询:

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

您可以使用Person.queryadd_columns方法追加计算值:

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

请记住,您取回元组列表(不是Person对象)。然而,每个元组包含Person对象和所计算的值:

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