SQLAlchemy Group By с полными дочерними объектами - PullRequest
0 голосов
/ 10 октября 2018

Представьте себе следующую таблицу Media:

| site       | show_id | time |
| ---------------------|-------|
| CNN        | 1       | 'a'   |
| ABC        | 2       | 'b'   |
| ABC        | 5       | 'c'   |
| CNN        | 3       | 'd'   |
| NBC        | 4       | 'e'   |
| NBC        | 5       | 'f'   |
--------------------------------

Я бы хотел перебрать результаты запроса, сгруппированные по show_id, и попробовал этот запрос:

listings = session.query(Media).filter(Media.site == "CNN").group_by(Media.show_id).all()

Вот как я хотел быперебрать результаты:

for showtimes in listings:
    for show in showtimes:
        print(show.time)

Но этот запрос не дает мне все сгруппированные дочерние объекты.Чего мне не хватает?

1 Ответ

0 голосов
/ 12 октября 2018

В SQL предложение GROUP BY объединяет сгруппированные строки в одну строку на основе выражений группировки.Я предполагаю, что вы используете SQLite или более старую версию MySQL, поскольку вам разрешено выбирать неагрегаты, при этом они не зависят функционально от выражений группировки.В этом случае результаты содержат значения из неопределенной строки для каждой группы, что редко - если вообще когда-либо - полезно.

Решение состоит в том, чтобы ORDER BY вместо GROUP BY в SQL, а затем group в Python на основе выражений заказа:

from itertools import groupby
from operator import attrgetter

listings = session.query(Media).\
    filter(Media.site == "CNN").\
    order_by(Media.show_id).\
    all()

# Materialize the subiterators to lists
listings = [list(g) for k, g in groupby(listings, attrgetter('show_id'))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...