SQLAlchemy中连接实体的筛选和排序

SQLAlchemy中连接实体的筛选和排序,sqlalchemy,filtering,relationship,Sqlalchemy,Filtering,Relationship,我有两个类,它们以一对多的关系(团队对团队中的球员)加入 我想查询特定位置球队的所有球员,然后按姓氏和名字排序 到目前为止,我的查询如下所示: query = db.session.query(Team).join(Player) \ .filter(Team.team_id = team) \ #team is passed in to the function .filter(Player.position.in_(['QB', 'RB', 'WR', 'TE'])) \

我有两个类,它们以一对多的关系(团队对团队中的球员)加入

我想查询特定位置球队的所有球员,然后按姓氏和名字排序

到目前为止,我的查询如下所示:

query = db.session.query(Team).join(Player) \
    .filter(Team.team_id = team) \ #team is passed in to the function
    .filter(Player.position.in_(['QB', 'RB', 'WR', 'TE'])) \
    .order_by(Player.last_name).order_by(Player.first_name).first()
SQL会相应地生成,当然,它缺少播放器表的映射字段除外

SELECT team.team_id AS team_team_id, team.name AS team_name, team.city AS team_city, team.state AS team_state, team."stadiumName" AS "team_stadiumName" 
FROM team JOIN player ON team.team_id = player.team 
WHERE team.team_id = :team_id_1 AND player.position IN (:position_1, :position_2, :position_3, :position_4) ORDER BY player.last_name, player.first_name
如果我使用查询(团队、玩家),我会得到元组。现在,它忽略了播放器对象上的筛选器和orderby子句。我肯定我错过了一些小东西

根据下面的建议,我尝试进行元组查询:

teams, players = db.session.query(Team, Player) \
    .filter(Team.team_id == team) \
    .filter(Player.position.in_(['QB', 'RB', 'WR', 'TE'])) \
    .order_by(Player.last_name).order_by(Player.first_name)
这导致

ValueError:要解压缩的值太多(应为2个)


执行单个往返结果的最简单方法是将两个实体都放入查询中:

query = db.session.query(Team, Player).join(Player) \
    .filter(Team.team_id == team) \
    .filter(Player.position.in_(['QB', 'RB', 'WR', 'TE'])) \
    .order_by(Player.last_name).order_by(Player.first_name)
这将返回与您的查询匹配的团队、玩家元组列表

获得顶级团队

team, p = query.first()
为了让玩家在查询中使用列表理解,如下所示

players=[player for _, player in query]

你说它忽略你的过滤器和订单是什么意思?它们在SQL中。您是否只需要
Player
对象的列表?是的。查询对象是与我的查询匹配的一个团队对象。当我调用query.Players时,它是球队花名册中所有球员的完整列表,而不是符合筛选/排序的经过排序、筛选的球员列表。但我想要球队以及一个顶级对象。类似地,当用户单击列表中的某个球员时,我想对加入其统计数据的球员进行另一次查询。@MichaelBrown如果您想要两者,那么为什么
查询(团队,球员)
不起作用?你需要做一些调整,使之成为一个单一的
团队
和一个
玩家列表
,而不是一个元组列表,但考虑到你的需求,这是最好的方法。我想我只是不知道如何工作。该元组包含对每个玩家重复一次的团队,然后是player?中的玩家列表@MichaelBrown返回
(团队,玩家)
元组列表。所有
团队
都是相同的。你可以通过
[player for uux,player in query]
获得你想要的玩家列表。我编辑了这个问题。团队,玩家=db.session.query(团队,玩家)\.filter(团队,玩家id==Team)\.filter(玩家.位置.输入(['QB','RB','WR','TE'])\.order(玩家.姓氏)。order(玩家.名字)导致值错误