两列加入相同的 table 与 SqlAlchemy
Two Columns joining the same table with SqlAlchemy
我正在使用 SqlAlchemy 在 Flask 中构建一个与运动相关的应用程序。我有一个 Game table,它有一个 home_team
和一个 away_team
,它们都加入了 Team table.
我希望能够声明 团队 table 和 游戏 table 之间的关系但我收到一条错误消息
Could not determine join condition between parent/child tables on relationship Team.games - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.
模型声明如下所示:
class Team(db.Model):
"""Team model."""
__tablename__ = "teams"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
monkier = db.Column(db.String)
town = db.Column(db.String)
games = db.relationship('Game')
def __init__(self):
......
class Game(db.Model):
"""Game model."""
__tablename__ = "games"
id = db.Column(db.Integer, primary_key=True)
date = db.Column(db.DateTime)
ground_id = db.Column(db.Integer, db.ForeignKey('grounds.id'))
round_id = db.Column(db.Integer, db.ForeignKey('rounds.id'))
home_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
away_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
home_score = db.Column(db.String)
away_score = db.Column(db.String)
ground = db.relationship('Ground')
round = db.relationship('Round')
home_team = db.relationship('Team',
primaryjoin="Game.home_team_id == Team.id")
away_team = db.relationship('Team',
primaryjoin="Game.away_team_id == Team.id")
def __init__(self):
......
看起来我必须将 foreign_keys
关键字参数传递给关系,但我不确定如何做,因为 away_team_id
和 home_team_id
.
当然也可能只是糟糕的数据库设计。
我认为您可以通过对模型进行一些调整来创建您正在寻找的关系。
class Team(db.Model):
"""Team model."""
__tablename__ = "teams"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
monkier = db.Column(db.String)
town = db.Column(db.String)
home_games = db.relationship('Game', foreign_keys='Game.home_team_id', backref='home_team', lazy='dynamic')
away_games = db.relationship('Game', foreign_keys='Game.away_team_id', backref='away_team', lazy='dynamic')
def __init__(self):
......
@property
def games(self):
return self.home_games.union(self.away_games)
class Game(db.Model):
"""Game model."""
__tablename__ = "games"
id = db.Column(db.Integer, primary_key=True)
date = db.Column(db.DateTime)
ground_id = db.Column(db.Integer, db.ForeignKey('grounds.id'))
round_id = db.Column(db.Integer, db.ForeignKey('rounds.id'))
home_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
away_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
home_score = db.Column(db.String)
away_score = db.Column(db.String)
ground = db.relationship('Ground')
round = db.relationship('Round')
def __init__(self):
......
现在您可以通过 Team
.
关系中定义的 backref
属性 访问 Team
模型
例如game.away_team
或 game.home_team
您还可以查询具体的主场、客场或特定球队的所有比赛。
all_home_games = team.home_games.all()
away_against_dodgers = team.away_games.filter_by(name='Dodgers').all()
some_date = DateTime(...)
all_games_before_date = team.games.filter(Game.date < some_date).all()
我正在使用 SqlAlchemy 在 Flask 中构建一个与运动相关的应用程序。我有一个 Game table,它有一个 home_team
和一个 away_team
,它们都加入了 Team table.
我希望能够声明 团队 table 和 游戏 table 之间的关系但我收到一条错误消息
Could not determine join condition between parent/child tables on relationship Team.games - there are multiple foreign key paths linking the tables. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference to the parent table.
模型声明如下所示:
class Team(db.Model):
"""Team model."""
__tablename__ = "teams"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
monkier = db.Column(db.String)
town = db.Column(db.String)
games = db.relationship('Game')
def __init__(self):
......
class Game(db.Model):
"""Game model."""
__tablename__ = "games"
id = db.Column(db.Integer, primary_key=True)
date = db.Column(db.DateTime)
ground_id = db.Column(db.Integer, db.ForeignKey('grounds.id'))
round_id = db.Column(db.Integer, db.ForeignKey('rounds.id'))
home_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
away_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
home_score = db.Column(db.String)
away_score = db.Column(db.String)
ground = db.relationship('Ground')
round = db.relationship('Round')
home_team = db.relationship('Team',
primaryjoin="Game.home_team_id == Team.id")
away_team = db.relationship('Team',
primaryjoin="Game.away_team_id == Team.id")
def __init__(self):
......
看起来我必须将 foreign_keys
关键字参数传递给关系,但我不确定如何做,因为 away_team_id
和 home_team_id
.
当然也可能只是糟糕的数据库设计。
我认为您可以通过对模型进行一些调整来创建您正在寻找的关系。
class Team(db.Model):
"""Team model."""
__tablename__ = "teams"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String)
monkier = db.Column(db.String)
town = db.Column(db.String)
home_games = db.relationship('Game', foreign_keys='Game.home_team_id', backref='home_team', lazy='dynamic')
away_games = db.relationship('Game', foreign_keys='Game.away_team_id', backref='away_team', lazy='dynamic')
def __init__(self):
......
@property
def games(self):
return self.home_games.union(self.away_games)
class Game(db.Model):
"""Game model."""
__tablename__ = "games"
id = db.Column(db.Integer, primary_key=True)
date = db.Column(db.DateTime)
ground_id = db.Column(db.Integer, db.ForeignKey('grounds.id'))
round_id = db.Column(db.Integer, db.ForeignKey('rounds.id'))
home_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
away_team_id = db.Column(db.Integer, db.ForeignKey('teams.id'))
home_score = db.Column(db.String)
away_score = db.Column(db.String)
ground = db.relationship('Ground')
round = db.relationship('Round')
def __init__(self):
......
现在您可以通过 Team
.
backref
属性 访问 Team
模型
例如game.away_team
或 game.home_team
您还可以查询具体的主场、客场或特定球队的所有比赛。
all_home_games = team.home_games.all()
away_against_dodgers = team.away_games.filter_by(name='Dodgers').all()
some_date = DateTime(...)
all_games_before_date = team.games.filter(Game.date < some_date).all()