Python 具有完整子对象的SQLAlchemy分组依据

Python 具有完整子对象的SQLAlchemy分组依据,python,sqlalchemy,Python,Sqlalchemy,想象一下下面的媒体表: | site | show_id | time | | ---------------------|-------| | CNN | 1 | 'a' | | ABC | 2 | 'b' | | ABC | 5 | 'c' | | CNN | 3 | 'd' | | NBC | 4 | 'e' | | NBC

想象一下下面的媒体表:

| 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)

但该查询并没有给出所有分组的子对象。我缺少什么?

在SQL中,GROUP BY子句根据分组表达式将分组行压缩为一行。我猜您使用的是SQLite,或者MySQL的旧版本,因为您可以选择非聚合,而不需要将它们放在分组表达式上。在这种情况下,结果包含来自每个组的未指定行的值,这很少有用

解决方案是在SQL中使用ORDER BY而不是GROUP BY,然后基于ORDER表达式:

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'))]

你得到了什么东西?还有什么都不见了?将预期输出和实际输出相加。您误解了分组依据的功能。Group by通常用于聚合。例如,您可以运行
select site,count(*)from media group by site
,这将导致每个站点有一行,以及该站点有多少行。但是你要求的不是聚合,我假设需要group_by的某种子查询来获取相关对象。