sqlalchemy group_by и считать - PullRequest
       5

sqlalchemy group_by и считать

2 голосов
/ 26 ноября 2011

Я использую флешку в качестве среды Python с sqlalchemy. Модели используют 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

Очевидно, что для этого нужно выбрать количество и группу по стране, штату, городу. Группировка за штукой работает, но я не знаю, как реализовать подсчет, поскольку у свойства запроса нет метода select, в этом случае я бы написал:

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

Кто-нибудь с идеей, как использовать query_property с group_by и count?

Ответы [ 2 ]

7 голосов
/ 08 ноября 2012

Вы можете использовать метод add_columns для Person.query, чтобы добавить вычисленные значения:

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

Имейте в виду, что вы получаете список кортежей (не объектов Person). Однако каждый кортеж содержит объект Person и вычисленное значение:

[(<Person object>, 3), (<Person object>, 7), ...]
2 голосов
/ 26 ноября 2011

Вы правы - вы не можете сделать это, используя 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()
    ....
...