2016-02-29 60 views
0

我有兩個以一對多關係加入的類(團隊與團隊中的玩家)。在SQLAlchemy中對聯合實體進行過濾和排序

我想查詢某個特定團隊的所有玩家的特定位置,並以最後的名字排序。

我的查詢看起來到目前爲止是這樣的:

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 

如果我使用的查詢(隊球員)我得到元組。現在,它忽略了Player對象上的過濾器和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: too many values to unpack (expected 2)

+0

你的意思是它忽略了你的過濾器和ORDER_BY?他們在SQL中。你只是想要一個'Player'對象列表嗎? – univerio

+0

是的。查詢對象是與我的查詢匹配的一個團隊對象。當我打電話給query.Players時,它是隊伍名單中所有球員的完整列表,而不是與篩選器/排序匹配的已排序,已過濾的球員列表。 –

回答

1

最簡單的方法來執行一個往返的結果是把兩個實體的查詢:

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,Player元組列表,它應該與您的查詢。

要到達頂級球隊

team, p = query.first() 

而獲得玩家使用列表理解上查詢像這樣

players=[player for _, player in query] 
+0

但我想要團隊以及單個頂級對象。 同樣,當用戶點擊到列表中的單個玩家時,我想要爲玩家加入其統計信息的另一個查詢。 –

+0

@MichaelBrown如果你想要兩個爲什麼'query(Team,Player)'沒有問題?你需要做一些按摩,把它變成一個'Team'和一個'Players'列表,而不是一個元組列表,但這是根據你的需求去做的最好方法。 – univerio

+0

我想我只是困惑如何工作。這個元組包含每個玩家重複一次,然後是玩家列表中的玩家列表? –

相關問題