SQLAlchemy Group With Full Child Objects

Raj*_*Raj 7 python sqlalchemy

想象一下以下媒体表:

| site       | show_id | time |
| ---------------------|-------|
| CNN        | 1       | 'a'   |
| ABC        | 2       | 'b'   |
| ABC        | 5       | 'c'   |
| CNN        | 3       | 'd'   |
| NBC        | 4       | 'e'   |
| NBC        | 5       | 'f'   |
--------------------------------
Run Code Online (Sandbox Code Playgroud)

我想迭代由show_id分组的查询结果并尝试过这个查询:

listings = session.query(Media).filter(Media.site == "CNN").group_by(Media.show_id).all()
Run Code Online (Sandbox Code Playgroud)

以下是我想迭代结果的方法:

for showtimes in listings:
    for show in showtimes:
        print(show.time)
Run Code Online (Sandbox Code Playgroud)

但该查询并未向我提供所有已分组的子对象.我错过了什么?

Ilj*_*ilä 10

在SQL中,GROUP BY子句根据分组表达式将分组的行压缩为单个行.我的猜测是你使用的是SQLite,或者是旧版本的MySQL,因为你可以选择非聚合,而不会在功能上依赖于分组表达式.在这种情况下,结果包含来自每组未指定行的值,这很少 - 如果有用的话 - 很有用.

解决方案是在SQL中使用ORDER BY而不是GROUP BY,然后根据顺序表达式在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'))]
Run Code Online (Sandbox Code Playgroud)