Исключение UnsupportedCompilationError
Исключение UnsupportedCompilationError наследуется от
CompileError и возникает, когда компилятор SQLAlchemy
не может преобразовать конструкцию запроса в SQL-код,
понятный конкретному диалекту базы данных. Это может
произойти при использовании функции или оператора,
который не поддерживается выбранной СУБД. Исключение
принимает объект компилятора и сообщение с деталями ошибки.
Синтаксис
UnsupportedCompilationError(compiler, message)
Пример
Давайте попробуем скомпилировать функцию concat
для диалекта, который её не поддерживает, и перехватим
исключение:
from sqlalchemy import create_engine, select, func
from sqlalchemy.exc import UnsupportedCompilationError
engine = create_engine('sqlite:///:memory:')
stmt = select(func.concat('article', 'user'))
try:
compiled = stmt.compile(dialect=engine.dialect)
print(compiled)
except UnsupportedCompilationError as exc:
print("UnsupportedCompilationError:", exc)
Результат выполнения кода:
"UnsupportedCompilationError: (sqlalchemy.dialects.sqlite.base.SQLiteCompiler) Compiler can't render element of type <class 'sqlalchemy.sql.functions.concat'>"
Пример
Давайте посмотрим, как выглядит атрибут compiler
у перехваченного исключения:
from sqlalchemy import create_engine, select, func
from sqlalchemy.exc import UnsupportedCompilationError
engine = create_engine('sqlite:///:memory:')
stmt = select(func.concat('article', 'user'))
try:
stmt.compile(dialect=engine.dialect)
except UnsupportedCompilationError as exc:
print("compiler:", exc.compiler)
print("message:", exc.message if hasattr(exc, 'message') else exc)
Результат выполнения кода:
"compiler: <sqlalchemy.dialects.sqlite.base.SQLiteCompiler object at 0x...>"
"message: Compiler can't render element of type <class 'sqlalchemy.sql.functions.concat'>"
Пример
Давайте используем конструкцию, которая не
поддерживается диалектом, и обработаем исключение
через блок try/except при выполнении запроса:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import UnsupportedCompilationError
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
try:
res = conn.execute(text('SELECT 1'))
print(res.fetchall())
except UnsupportedCompilationError as exc:
print("UnsupportedCompilationError:", exc)
Результат выполнения кода:
[(1,)]
Смотрите также
-
исключение
CompileError,
базовый класс для ошибок компиляции -
исключение
SQLAlchemyError,
корневое исключение всех ошибок SQLAlchemy -
исключение
StatementError,
ошибка, связанная с выполнением выражения -
исключение
NotSupportedError,
ошибка неподдерживаемой операции СУБД