Sqlalchemy AmbiguousForeignKeysError?

Ссылка скопирована
1 ответ
class User(Base):     __tablename__ = '_users'     id = Column(String(), primary_key=True)     firstname = Column(String(100))     lastname = Column(String(100))     reg_date = Column(DateTime(), server_default=text('CURRENT_TIMESTAMP'))     transactions = relationship('InnerTransaction')  class InnerTransaction(Base):     __tablename__ = '_transactions'     id = Column(Integer(), primary_key=True, autoincrement=False)     sender_id = Column(String(), ForeignKey('_users.id'))     receiver_id = Column(String(), ForeignKey('_users.id'))     amount = Column(String())     created_at = Column(DateTime(), server_default=text('CURRENT_TIMESTAMP'))

class User(Base): __tablename__ = '_users' id = Column(String(), primary_key=True) firstname = Column(String(100)) lastname = Column(String(100)) reg_date = Column(DateTime(), server_default=text('CURRENT_TIMESTAMP')) transactions = relationship('InnerTransaction') class InnerTransaction(Base): __tablename__ = '_transactions' id = Column(Integer(), primary_key=True, autoincrement=False) sender_id = Column(String(), ForeignKey('_users.id')) receiver_id = Column(String(), ForeignKey('_users.id')) amount = Column(String()) created_at = Column(DateTime(), server_default=text('CURRENT_TIMESTAMP'))

Эти модели корректно создают таблицы, но при обращении к таблицам возникает ошибка:

Exception has occurred: AmbiguousForeignKeysError
Could not determine join condition between parent/child tables on relationship User.transactions - 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.

В документации есть похожие примеры, однако как их применить на свой случай я не разобрался.

Как правильно организовать связь таблиц с несколькими внешними ключами?

Дополнительно:

В документации пример есть. Там не похожий, а точно такой случай:
https://docs.sqlalchemy.org/en/14/orm/join_conditi...

https://stackoverflow.com/questions/44434410/sqlal...

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Елена Вебер Ответ

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

Чтобы решить эту проблему, вам необходимо явно указать sqlalchemy, какую внешнюю ключевую колонку использовать для соединения таблиц. Вы можете сделать это, установив параметр primaryjoin в связи ForeignKey.

Пример:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
 
Base = declarative_base()
 
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String)
 
class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    email = Column(String)
    user_id = Column(Integer, ForeignKey('users.id'))
 
    user = relationship("User", primaryjoin=user_id == User.id)

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import relationship Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) class Address(Base): __tablename__ = 'addresses' id = Column(Integer, primary_key=True) email = Column(String) user_id = Column(Integer, ForeignKey('users.id')) user = relationship("User", primaryjoin=user_id == User.id)

В этом примере, мы явно указываем sqlalchemy, что связь между Address и User должна быть установлена на основе user_id и id соответственно.

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

Надеюсь, это поможет вам разобраться с ошибкой AmbiguousForeignKeysError в sqlalchemy. Если у вас остались вопросы, не стесняйтесь задавать.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно