Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 使用SqlAlchemy连接同一个表的两列_Sqlite_Python 3.x_Flask_Flask Sqlalchemy - Fatal编程技术网

Sqlite 使用SqlAlchemy连接同一个表的两列

Sqlite 使用SqlAlchemy连接同一个表的两列,sqlite,python-3.x,flask,flask-sqlalchemy,Sqlite,Python 3.x,Flask,Flask Sqlalchemy,我正在使用SqlAlchemy在Flask中构建一个与运动相关的应用程序。我有一个游戏桌,有一个主队和一个客队,它们都加入了团队桌 我希望能够声明团队表和游戏表之间的关系,但我得到一个错误,即 无法确定relationship Team.games上的父/子表之间的联接条件-有多个外键路径链接这些表。指定'foreign_keys'参数,提供应计为包含对父表的外键引用的列的列表。 模型声明如下所示: class Team(db.Model): """Team model."""

我正在使用SqlAlchemy在Flask中构建一个与运动相关的应用程序。我有一个游戏桌,有一个
主队
和一个
客队
,它们都加入了团队桌

我希望能够声明团队表和游戏表之间的关系,但我得到一个错误,即

无法确定relationship Team.games上的父/子表之间的联接条件-有多个外键路径链接这些表。指定'foreign_keys'参数,提供应计为包含对父表的外键引用的列的列表。

模型声明如下所示:

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):
           ......
看起来我必须将
外键
关键字参数传递给关系,但我不确定该怎么做,因为这对于
客场球队id
主场球队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
模型

e、 g.
客场球队
主场球队

您还可以查询特定于球队的主客场或所有比赛

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()
all_home_games=team.home_games.all()
客场对阵道奇队=团队。客场比赛。按(name='dodgers')筛选。全部()
some_date=DateTime(…)
日期之前的所有游戏=team.games.filter(Game.date<某些日期).all()

谢谢,这对我帮助很大。但是,我想指出的是,您应该使用
@sqlalchemy.ext.hybrid.hybrid_property
而不是
@property
,因为它可以像普通属性一样执行某些操作