Исключение 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,
которое возникает при некорректном запросе