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的某种子查询来获取相关对象。