Исключение CompileError
Исключение CompileError наследуется от
SQLAlchemyError
и возникает, когда SQLAlchemy не может
скомпилировать SQL-выражение для конкретного
диалекта базы данных. Это может произойти
при использовании неподдерживаемых конструкций,
некорректных имен столбцов или таблиц,
а также при работе с диалектами, которые
не поддерживают определенные возможности SQL.
Синтаксис
from sqlalchemy.exc import CompileError
try:
# compilation code
pass
except CompileError as e:
print(e)
Пример
Давайте попробуем скомпилировать выражение
с несуществующим именем таблицы и перехватим
исключение CompileError:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import CompileError
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
try:
res = conn.execute(text('SELECT * FROM unknown_table'))
except CompileError as e:
print('CompileError:', e)
Пример
Давайте создадим модель с недопустимым типом столбца и попробуем создать таблицу:
from sqlalchemy import create_engine
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy.exc import CompileError
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
try:
Base.metadata.create_all(engine)
print('Tables created successfully')
except CompileError as e:
print('CompileError:', e)
Пример
Давайте попробуем использовать функцию
func с несуществующей SQL-функцией
и обработаем исключение:
from sqlalchemy import create_engine, select, func
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
from sqlalchemy.exc import CompileError
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
try:
stmt = select(func.nonexistent_function(Article.id))
res = session.execute(stmt).all()
print(res)
except CompileError as e:
print('CompileError:', e)
Пример
Давайте перехватим исключение через базовый
класс SQLAlchemyError, чтобы убедиться,
что CompileError является его наследником:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import SQLAlchemyError, CompileError
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
try:
res = conn.execute(text('SELECT invalid syntax'))
except SQLAlchemyError as e:
print('Caught:', type(e).__name__)
print('Is CompileError:', isinstance(e, CompileError))
Смотрите также
-
исключение
SQLAlchemyError,
которое является базовым для всех исключений SQLAlchemy -
исключение
UnsupportedCompilationError,
которое возникает при неподдерживаемой компиляции -
исключение
StatementError,
которое оборачивает ошибки выполнения SQL-выражений -
исключение
ProgrammingError,
которое возникает при ошибках программирования в SQL