@neoficialniy

Ошибка InvalidForeignKey, уникальность соблюдена, в чем ошибка?

Подскажите, почему выдает ошибку, хотя во всех задействованных с связках полях все поля unique=True или primary_key

Ошибка InvalidForeignKey: sqlalchemy.exc.ProgrammingError: (psycopg2.errors.InvalidForeignKey) ОШИБКА: в целевой внешней таблице "users" нет ограничения уникальности, соответствующего данным ключам
[SQL:
CREATE TABLE participants (
event_id INTEGER NOT NULL,
user_id BIGINT NOT NULL,
PRIMARY KEY (user_id),
FOREIGN KEY(event_id) REFERENCES events (id),
UNIQUE (user_id),
FOREIGN KEY(user_id) REFERENCES users (user_id)
)

Модели:
class User(Base):
__tablename__ = 'users'
user_name = Column(String(33), unique=True)
user_id = Column(BigInteger, primary_key=True, index=True, nullable=False)
subscribe = Column(Boolean, unique=False, default=False)
initiators = relationship('Initiator', backref='initiators', uselist=False)
participants = relationship('Participant', backref='participants')

class Initiator(Base):
__tablename__ = 'initiators'
id = Column(Integer, primary_key=True, nullable=False)
initiator_id = Column(BigInteger, ForeignKey('users.user_id'), unique=True, nullable=False)
initiators = relationship('Event', backref='events')

class Event(Base):
__tablename__ = 'events'
id = Column(Integer, primary_key=True, unique=True)
initiator_id = Column(BigInteger, ForeignKey('initiators.initiator_id'), unique=True, nullable=False)
date = Column(Date)
datetime = Column(DateTime)
title = Column(String(50))
about = Column(String(500))
number_of_participants = Column(Integer)
initiators = relationship('Initiator')

class Participant(Base):
__tablename__ = 'participants'
event_id = Column(Integer, ForeignKey('events.id'), unique=False, nullable=False)
user_id = Column(BigInteger, ForeignKey('users.user_id'), primary_key=True, unique=True)

В итоге в базе создалось 3 из 4 таблиц. Я удалил те, которые создались, подправил код по рекомендациям и создал новые
  • Вопрос задан
  • 218 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега PostgreSQL
Седой и строгий
Вы пытаетесь что-то сохранить в БД, что ссылается на user, которого в БД нет.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Akina
Сетевой и системный админ, SQL-программист.
ОШИБКА: в целевой внешней таблице "users" нет ограничения уникальности, соответствующего данным ключам

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

FOREIGN KEY(user_id) REFERENCES users (user_id)

Таблица users должна существовать.
В ней должно существовать поле user_id.
Это поле должно быть определено как уникальное. Причём отдельно, а не в составе композитного уникального индекса.

Так что смотрите, что именно нагенерила модель.

PS. Если определено PRIMARY KEY (user_id), то дополнительное UNIQUE (user_id) абсолютно бессмысленно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы