2011-11-25 116 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), ...]