通过两个表连接查询 Flask-SQLAlchemy

ham*_*nan 6 python sqlalchemy flask flask-sqlalchemy

我有三个表(用于与运动相关的应用程序):回合、游戏和联赛。

我想找到最近一轮的联赛。为此,我需要找到最新的游戏并找到它所在的回合。

在我的模型回合中有很多比赛,回合有联赛,但比赛和联赛之间没有直接关系。

这是我的模型简化:

class Round(db.Model):
    """Round Model."""

    __tablename__ = 'rounds'

    id = db.Column(db.Integer, primary_key=True)
    order = db.Column(db.Integer, nullable=False)
    league_id = db.Column(db.Integer, db.ForeignKey('leagues.id'))

    league = db.relationship('League', backref='rounds')


class Game(db.Model):
    """Game model."""

    __tablename__ = "games"

    id = db.Column(db.Integer, primary_key=True)
    utc_time = db.Column(db.DateTime)
    round_id = db.Column(db.Integer, db.ForeignKey('rounds.id'))

    round = db.relationship('Round', backref="games")


class League(db.Model):
    """League Model."""

    __tablename__ = 'leagues'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False)

    def __init__(self, name, abbreviation, other_names):
        self.name = name
Run Code Online (Sandbox Code Playgroud)

如何使用 round.league 条件查询游戏?

我在想这样的事情,但它不起作用:

game = Game.query.join(Round).join(League).filter(
        Game.utc_time < datetime.utcnow(),
        League.id == league.id
    ).order_by(Game.utc_time.desc()).first()
Run Code Online (Sandbox Code Playgroud)

ham*_*nan 7

在倾注 SQLAlchemy 文档数小时后,解决方案很简单,我需要在定义连接时更加明确。我想出于某种原因,表连接对 SQLAlchemy 来说并不明显。

而不是join(League)我必须告诉它在哪里加入join(League, Round.league_id == League.id)

查询最终看起来像这样:

game = Game.query.join(Round).join(
    League, Round.league_id == League.id
).filter(
    Game.utc_time < datetime.utcnow(),
    League.id == league.id
).order_by(Game.utc_time.desc()).first()
Run Code Online (Sandbox Code Playgroud)