2016-02-10 2 views
2
class Match(Base): 
    __tablename__ = 'matches' 

    id = Column(Integer, primary_key=True) 
    date = Column(Date, nullable=False) 
    time = Column(Time, nullable=True) 
    league_id = Column(ForeignKey('leagues.id'), nullable=False, index=True) 
    league = relationship('League', backref='matches') 
    type = Column(enums.matches_types) 
    home_team_id = Column(ForeignKey('teams.id'), nullable=False, index=True) 
    home_team = relationship('Team', foreign_keys=[home_team_id], backref='home_matches') 
    away_team_id = Column(ForeignKey('teams.id'), nullable=False, index=True) 


class Team(Base): 
    __tablename__ = 'teams' 

    id = Column(Integer, primary_key=True) 
    name = Column(String, nullable=False) 
    country_id = Column(ForeignKey('countries.id'), nullable=False, index=True) 
    country = relationship('Country', backref='teams') 

Мне нужно написать запрос, который объединяет таблицы столбцов и команд, отображающие информацию о командах для локальной и гостевой команды.SQL Alchemy Присоединиться к нескольким столбцам из одной таблицы

Session.query(Match.date, Match.home_team.name, Match_away_team.name).joins(Team) 

Это возвращает Can't determine join between 'matches' and 'teams'; tables have more than one foreign key constraint relationship between them. Please specify the 'onclause' of this join explicitly

ответ

3

Во-первых, причина, код не работает, потому что SQLAlchemy не знает, хотите ли вы присоединиться к Team через home_team или away_team, так что вы должны сказать Это. Кроме того, вам нужно будет присоединиться к Team дважды, что еще больше усложняет ситуацию.

Это может быть сделано более легко с помощью joinedload:

matches = session.query(Match).options(joinedload(Match.home_team), 
             joinedload(Match.away_team)) 
for m in matches: 
    print m.date, m.home_team, m.away_team 

m.home_team и m.away_team будут загружены в том же запросе, как m с использованием JOIN.

Если вы настаиваете на использовании явного .join() вам придется alias в Team сущности (не протестированные):

home = aliased(Team) 
away = aliased(Team) 
q = session.query(Match.date, home, away).join(home, Match.home_team) \ 
             .join(away, Match.away_team) 
for date, home_team, away_team in q: 
    print date, home_team, away_team 
Смежные вопросы