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

Исключение InternalError

Исключение InternalError наследуется от DBAPIError и представляет ошибку, возникшую внутри самой базы данных или драйвера. Оно поднимается, когда СУБД сообщает о внутреннем сбое: повреждении курсора, сбое транзакции, некорректном состоянии соединения и тому подобном. Первым параметром исключение принимает текст сообщения об ошибке, а также может содержать исходное исключение драйвера в атрибуте orig.

В отличие от OperationalError, которое связано с проблемами подключения, и ProgrammingError, которое возникает из-за неверного SQL, InternalError указывает на то, что сам запрос был корректен, но база данных не смогла его выполнить по внутренним причинам.

Синтаксис

from sqlalchemy.exc import InternalError raise InternalError(statement, params, orig)

Пример

Давайте рассмотрим иерархию наследования класса InternalError и убедимся, что он относится к группе ошибок DBAPIError:

from sqlalchemy.exc import InternalError, DBAPIError, SQLAlchemyError print(issubclass(InternalError, DBAPIError)) print(issubclass(InternalError, SQLAlchemyError))

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

True True

Пример

Давайте создадим экземпляр исключения InternalError вручную и посмотрим на его атрибуты:

<+python+> from sqlalchemy.exc import InternalError orig = Exception('internal cursor failure') err = InternalError('SELECT 1', {}, orig) print(err.statement) print(err.params) print(err.orig) print(str(err)) <-python+>

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

SELECT 1 {} internal cursor failure (builtins.Exception) internal cursor failure [SQL: SELECT 1]

Пример

Давайте перехватим InternalError при работе с реальной базой данных. В этом примере мы специально вызовем ошибку через некорректное обращение к драйверу:

from sqlalchemy import create_engine, text from sqlalchemy.exc import InternalError engine = create_engine('sqlite:///:memory:') with engine.connect() as conn: try: conn.execute(text('SELECT * FROM missing_table')) except InternalError as err: print('InternalError caught:') print(err.orig)

В данном случае SQLite вернёт ошибку отсутствующей таблицы, которая в SQLAlchemy может быть представлена как OperationalError. Аналогично перехватывается и InternalError, если драйвер сообщает о внутреннем сбое. Результат может выглядеть так:

"InternalError caught:"

Пример

Давайте напишем универсальный обработчик, который различает InternalError и другие ошибки семейства DBAPIError:

from sqlalchemy import create_engine, text from sqlalchemy.exc import InternalError, OperationalError, DBAPIError engine = create_engine('sqlite:///:memory:') def run_query(conn, query): try: res = conn.execute(text(query)) return res.fetchall() except InternalError as err: print('Internal DB failure:', err.orig) except OperationalError as err: print('Operational failure:', err.orig) except DBAPIError as err: print('Other DBAPI failure:', err.orig) with engine.connect() as conn: run_query(conn, 'SELECT 1')

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

[(1,)]

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

  • исключение SQLAlchemyError,
    которое является базовым для всех ошибок библиотеки
  • исключение DBAPIError,
    которое объединяет ошибки драйверов баз данных
  • исключение OperationalError,
    которое сигнализирует о проблемах соединения и работы СУБД
  • исключение InterfaceError,
    которое возникает при ошибках взаимодействия с интерфейсом драйвера
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить