2016-04-15 10 views
0

同じ列の2つの列を結合することを含むクエリを実行しようとしています。SQL Alchemy Strange behavior同じテーブルの複数の列を結合する

これらは私のモデルです:

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_id = Column(ForeignKey('teams.id'), nullable=False, index=True) 
    home = relationship('Team', foreign_keys=[home_id], backref='home_matches') 
    away_id = Column(ForeignKey('teams.id'), nullable=False, index=True) 
    away = relationship('Team', foreign_keys=[away_id], backref='away_matches') 


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

これは私がSQLAlchemyの中で書いたものです:SQLAlchemyのは、純粋なSQLを行い

self.db_match = Session.query(Match).join(home, Match.home).options(contains_eager(Match.home) 
         ).join(away, Match.away).options(contains_eager(Match.away) 
         ).join(Match.b_reference).options(contains_eager(Match.b_reference) 
         ).filter(home.name == self.match['home']['name'] 
         ).filter(away.name == self.match['away']['name'] 
         ).filter(Match.date == self.match['date']) 

翻訳は以下の通りです:

SELECT teams_1.name, teams_2.name, matches.id, matches_b_reference_codes.code 
FROM teams, matches JOIN teams AS teams_1 ON teams_1.id = matches.home_id 
JOIN teams AS teams_2 ON teams_2.id = matches.away_id 
JOIN matches_b_reference_codes ON matches.id = matches_b_reference_codes.match_id 
WHERE teams_1.name = 'Portland Trail Blazers' AND teams_2.name = 'Miami Heat' AND matches.date = '2011-01-09'; 

しかしこれが私の必要なものです:

SELECT teams_1.name, teams_2.name, matches.id, matches_b_reference_codes.code 
**FROM matches JOIN teams AS teams_1 ON teams_1.id = matches.home_id** 
JOIN teams AS teams_2 ON teams_2.id = matches.away_id 
JOIN matches_b_reference_codes ON matches.id = matches_b_reference_codes.match_id 
WHERE teams_1.name = 'Portland Trail Blazers' AND teams_2.name = 'Miami Heat' AND matches.date = '2011-01-09'; 
+0

「ホーム」とは何ですか、離れているのですか? 'Match.home'と' Match.away'は何ですか? – univerio

+0

申し訳ありません。モデルにエラーがあります。私はそれを訂正した。 – FranGoitia

答えて

1

contains_eagerを間違って使用しています。エイリアスに参加するときにaliasパラメータを指定する必要があります。

home = aliased(Team) 
away = aliased(Away) 
Session.query(Match).join(home, Match.home) \ 
        .options(contains_eager(Match.home, alias=home)) \ 
        .join(away, Match.away) \ 
        .options(contains_eager(Match.away, alias=away)) \ 
        ... \ 
        .filter(...) 
関連する問題