我正在使用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?
一起使用的人答案 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()
....