2017-01-19 8 views
1

SQL Alchemyを初めて使用し、ジョインから望ましい結果を得るためにいくつかの問題が発生しました。 私はそれぞれのためにSQL Alchemyでネストされたリレーションシップに参加する

class QShow(db.Model): 
     id = db.Column(db.Integer, primary_key=True) 
     name = db.Column(db.String(50)) 
     starts_on = db.Column(db.Date) 
     ends_on = db.Column(db.Date) 
     form_id = db.Column(db.String(50)) 

class Competition(db.Model): 
     id = db.Column(db.Integer, primary_key=True) 
     name = db.Column(db.String(60)) 
     show_id = db.Column(db.Integer,db.ForeignKey('q_show.id')) 
     show = db.relationship("QShow", backref=db.backref("showa", uselist=False)) 

class Start(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    rider_id = db.Column(db.Integer, db.ForeignKey('rider.id')) 
    rider = db.relationship("Rider", backref=db.backref("riders", uselist=False)) 
    competition_id = db.Column(db.Integer, db.ForeignKey('competition.id')) 
    competition = db.relationship("Competition", backref=db.backref("competitiona", uselist=False)) 
    show_id = db.Column(db.Integer, db.ForeignKey('q_show.id')) 
    show = db.relationship("QShow", backref=db.backref("shows",uselist=False)) 

class Rider(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    first_name = db.Column(db.String(30)) 
    last_name = db.Column(db.String(35)) 
    starts = db.relationship('Start',backref='riderref',lazy='dynamic') 

は、複数の競技がある示し、次のモデルがあり、それぞれの競争は、複数の開始を持って、ライダーは、競争に参加するために、開始を必要とし、彼らには、複数のあたりを持つことができます。これらはすべてショーの一部です。

競合データと開始データは、show_idのFKを持つため、照会が容易です。しかし、私は特定のショーのすべてのライダーを取得するために探しています。

このクエリでは、表示に関係なく、すべてのライダーを取得しています。私は何かが足りないことを知っている。

rider = Rider.query \ 
      .join(Start) \ 
      .join(Competition) \ 
      .filter(QShow.id == show_id) 

誰かが私にこの狂気を理解させるのに役立つことができますか?私は理にかなっている、参加にQShowを追加しようとしました

UPDATE 1

は、しかし、私はまだ全番組からライダーを受けます。

rider = Rider.query \ 
      .join(Start) \ 
      .join(Competition) \ 
      .join(QShow)\ 
      .filter(QShow.id == show_id) 

それについて考えて、私は作品回避策は、しかし、私はまだ私はライダーから参加するすべての方法で間違ってやっていたかを理解したいと思いました2

UPDATE - >ショー。

rider = Rider.query \ 
      .join(Start) \ 
      .filter(Start.show_id == show_id) 
+2

あなたは 'QShow'テーブルで' .join'しませんでした、なぜですか? –

+0

私は同じ結果でそれを試しました – CareFree

+1

あなたが試した方法を投稿し、可能であれば質問に関連コードを投稿してください。クエリの最後に '.all()'が表示されません。 –

答えて

0

@univerioが正しい。この問題は、データベースの外部キーに矛盾がありました。いったん私はそれを固定し、結合ステートメントは完全に働いた。

関連する問題