SQLAlchemy один на один, хранить внешний ключ в каждой таблице? - PullRequest
1 голос
/ 20 июня 2019

У меня есть отношение один к одному между кодами клетки и числами Дуна.

Я настроил свои отношения так, как будто я храню ForeignKey на каждой из соответствующих таблиц.

class Cage(Base):
    __tablename__ = 'DimCage'

    id = Column(Integer, primary_key=True)
    cage = Column(String(8), unique=True, nullable=False)
    duns_id = Column(Integer, ForeignKey('DimDuns.id'))

    duns = relationship('Duns', uselist=False, back_populates='cage')


class Duns(Base):
    __tablename__ = 'DimDuns'

    id = Column(Integer, primary_key=True)
    duns = Column(String(10), unique=True, nullable=False)
    dunsInt = Column(Integer, unique=True, nullable=False)
    cage_id = Column(Integer, ForeignKey('DimCage.id'))

    cage = relationship('Cage', uselist=False, back_populates='duns')

Когда я создаю таблицы, я получаю сообщение об ошибке ниже, как мне настроить внешние ключи, чтобы я мог сохранить ссылку на обе таблицы?

sqlalchemy.exc.AmbiguousForeignKeysError: Невозможно определить соединение между 'DimCage' и 'DimDuns'; таблицы имеют более одного отношения ограничения внешнего ключа между ними. Пожалуйста, укажите 'onclause' этого соединения явно.

И во время обработки вышеупомянутого исключения произошло другое исключение:

sqlalchemy.exc.AmbiguousForeignKeysError: Не удалось определить условие соединения между родительскими / дочерними таблицами в отношении Cage.duns - существует несколько путей внешнего ключа, связывающих таблицы. Укажите аргумент foreign_keys, предоставляющий список тех столбцов, которые должны учитываться как содержащие ссылку на внешний ключ родительской таблицы.

1 Ответ

1 голос
/ 20 июня 2019

Полагаю, вам нужно хранить только один внешний ключ для отношений один-к-одному.
См. https://docs.sqlalchemy.org/en/13/orm/basic_relationships.html#one-to-one

Таким образом, вы не должны терять доступ к данным.Если вы удалите столбец duns_id из Cage, вы получите доступ к идентификатору с помощью cage.duns.id вместо cage.duns_id.

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