Не удалось определить условие соединения между родительскими / дочерними таблицами, устанавливая foreign_keys - PullRequest
0 голосов
/ 15 июня 2019
class Team(db.Model):
    __tablename__ = "Teams"
    id = db.Column(db.Integer, primary_key=True)
    flashscore_id = db.Column(db.String(255), nullable=False, unique=True)
    name = db.Column(db.String(255), nullable=False)

    leagues = db.relationship("League",
                    secondary=league_teams_table)

    standings = db.relationship('Standing', backref='teams', cascade="all,delete")
    fixtures = db.relationship('Fixture', backref='teams', cascade="all,delete")

related_fixtures_table = db.Table('RelatedFixtures',
    db.Column('fixture_id', db.Integer, db.ForeignKey('Fixtures.id')),
    db.Column('related_fixture_id', db.Integer, db.ForeignKey('Fixtures.id')))

class Fixture(db.Model):
    __tablename__ = "Fixtures"
    id = db.Column(db.Integer, primary_key=True)

    home_id = db.Column(db.Integer, db.ForeignKey('Teams.id'),
        nullable=False)
    away_id = db.Column(db.Integer, db.ForeignKey('Teams.id'),
        nullable=False)

    home_ref = db.relationship("Teams", backref="fixture", uselist=False, foreign_keys=[home_id])
    away_ref = db.relationship("Teams", backref="fixture", uselist=False, foreign_keys=[away_id])

    flashscore_id = db.Column(db.String(255), nullable=False, unique=True)
    total_goals = db.Column(db.Integer, nullable=False)

    total_fh_goals = db.Column(db.Integer, nullable=False, default=0)
    total_sh_goals = db.Column(db.Integer, nullable=False, default=0)

    total_home_goals = db.Column(db.Integer, nullable=False)
    total_away_goals = db.Column(db.Integer, nullable=False)

    total_home_fh_goals = db.Column(db.Integer, nullable=False, default=0)
    total_home_sh_goals = db.Column(db.Integer, nullable=False, default=0)

    total_away_fh_goals = db.Column(db.Integer, nullable=False, default=0)
    total_away_sh_goals = db.Column(db.Integer, nullable=False, default=0)

    related_fixtures = db.relationship("Fixture",
                    secondary=related_fixtures_table)

Я написал приведенный выше код, пытаясь определить множественные отношения между Fixture и Team. Когда я запускаю приложение и выполняю действие, я получаю следующую ошибку:

sqlalchemy.exc.AmbiguousForeignKeysError: Could not determine join condition between parent/child tables on relationship Team.fixtures - 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.

Я попытался решить эту проблему, добавив следующие две строки:

home_ref = db.relationship("Teams", backref="fixture", uselist=False, foreign_keys=[home_id])
    away_ref = db.relationship("Teams", backref="fixture", uselist=False, foreign_keys=[away_id])

Но я все еще получаю ту же ошибку. Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 15 июня 2019

Вам необходимо настроить отношение fixtures в классе Team, потому что именно это и говорит вам ошибка: Could not determine join condition ... on <strong>relationship Team.fixtures</strong>.

Однако вы не можете исправить эту ситуацию с помощью foreign_keys; который ожидает один (возможно, составной) внешний ключ, и у вас есть два различных отношения внешнего ключа. Вам нужно создать два отдельных отношения: одно для матчей, где эта команда является домашней командой, а другое для отношений away.

Если вы хотите, чтобы Team.fixtures возвращал список всех Fixture строк, которые ссылаются на команду через один или оба внешних ключа, вам нужно создать пользовательское условие primaryjoin, которое соответствует вашему Team.id по отношению к home_id или столбец away_id (и вы, вероятно, захотите добавить условие DISTINCT в свой запрос, чтобы избежать дублирования результатов для приборов, которые подключаются к вашей команде через оба внешних ключа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...