sqlalchemy group_by и количество

Я использую flask в качестве фреймворка 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

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

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

Любой, кто знает, как использовать query_property с group_by и count?


person Romeo M.    schedule 25.11.2011    source источник


Ответы (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()
    ....
person van    schedule 26.11.2011

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

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

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

[(<Person object>, 3), (<Person object>, 7), ...]
person Zach Mathew    schedule 08.11.2012