Неоднозначный внешний ключ SQLAlchemy - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть два класса, User и Address. У пользователя может быть много адресов и один адрес по умолчанию. Я попробовал этот код SQLAlchemy.

from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String
from sqlalchemy import ForeignKey

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.orm import sessionmaker, relationship


engine = create_engine('sqlite:///:memory:', echo=True)

Base = declarative_base()


class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    default_address_id = Column(Integer, ForeignKey('addresses.id'))
    name = Column(String)
    fullname = Column(String)
    nickname = Column(String)

    addresses = relationship("Address", order_by="Address.id", back_populates="user")


class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    email_address = Column(String, nullable=False)
    user_id = Column(Integer, ForeignKey('users.id'))

    user = relationship("User", back_populates="addresses")


Base.metadata.create_all(engine)

Это приводит к ошибке

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

Я попытался добавить foreign_keys в отношения, но не смог сделать это правильно.

1 Ответ

0 голосов
/ 28 февраля 2020

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

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