РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
704 of 711 menu

Исключение NoReferencedTableError

Исключение NoReferencedTableError наследуется от SQLAlchemyError и возникает, когда SQLAlchemy не может найти таблицу, на которую ссылается внешний ключ. Это происходит, если таблица не была определена в том же объекте MetaData или не была импортирована в момент создания связи. Первым параметром исключение принимает текстовое сообщение с именем отсутствующей таблицы.

Синтаксис

NoReferencedTableError(message)

Пример

Давайте попробуем создать таблицу с внешним ключом на несуществующую таблицу users:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey from sqlalchemy.orm import DeclarativeBase class Base(DeclarativeBase): pass class Article(Base): __tablename__ = 'articles' id = Column(Integer, primary_key=True) title = Column(String) user_id = Column(Integer, ForeignKey('users.id')) engine = create_engine('sqlite:///:memory:') try: Base.metadata.create_all(engine) except Exception as e: print(type(e).__name__) print(e)

Результат выполнения кода:

"NoReferencedTableError: Foreign key associated with column 'articles.user_id' could not find table 'users' with which to generate a foreign key to target column 'id'"

Пример

Давайте исправим ошибку, определив таблицу users перед таблицей articles:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey from sqlalchemy.orm import DeclarativeBase class Base(DeclarativeBase): pass class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) class Article(Base): __tablename__ = 'articles' id = Column(Integer, primary_key=True) title = Column(String) user_id = Column(Integer, ForeignKey('users.id')) engine = create_engine('sqlite:///:memory:') Base.metadata.create_all(engine) print('tables created:', list(Base.metadata.tables.keys()))

Результат выполнения кода:

"tables created: ['users', 'articles']"

Пример

Ошибка также возникает, если таблица определена в другом объекте MetaData. Давайте воспроизведем эту ситуацию:

<+python+> from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, ForeignKey metadata1 = MetaData() metadata2 = MetaData() users = Table( 'users', metadata1, Column('id', Integer, primary_key=True), Column('name', String) ) articles = Table( 'articles', metadata2, Column('id', Integer, primary_key=True), Column('title', String), Column('user_id', Integer, ForeignKey('users.id')) ) engine = create_engine('sqlite:///:memory:') try: metadata2.create_all(engine) except Exception as e: print(type(e).__name__) print(e) <-python+>

Результат выполнения кода:

"NoReferencedTableError: Foreign key associated with column 'articles.user_id' could not find table 'users' with which to generate a foreign key to target column 'id'"

Смотрите также

  • исключение SQLAlchemyError,
    которое является базовым для всех исключений SQLAlchemy
  • исключение NoForeignKeysError,
    которое возникает при отсутствии внешних ключей
  • исключение AmbiguousForeignKeysError,
    которое возникает при неоднозначных внешних ключах
  • исключение InvalidRequestError,
    которое возникает при некорректном запросе
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить