在SQL Alchemy中加入嵌套关系

时间:2017-01-19 18:17:37

标签: python sqlalchemy

我是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)

有人能帮助我理解这种疯狂吗?

更新1

我已经尝试将QShow添加到联接中,这是有道理的,但我仍然会收到所有节目中的骑手。

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

更新2

在考虑它时,我做了一个有效的解决方法,但是我仍然想要了解我从Rider一直到加入的错误 - >展。

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

1 个答案:

答案 0 :(得分:0)

@univerio是对的。问题是数据库外键不一致。一旦我解决了这个问题,连接语句就能很好地完成。