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)
在倾注 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)