Исключение InterfaceError
Исключение InterfaceError в SQLAlchemy
представляет ошибку, возникающую на уровне
интерфейса драйвера базы данных. Оно не связано
с ошибкой самого SQL-запроса, а указывает на
проблему в программном интерфейсе между
SQLAlchemy и низкоуровневым DBAPI-драйвером.
Исключение наследуется от класса DBAPIError
и, следовательно, от базового класса
SQLAlchemyError.
Причиной InterfaceError обычно становятся:
некорректное использование курсора, обращение
к закрытому соединению, несовместимость версии
драйвера или передача в драйвер значений
неподдерживаемого типа. Параметров у самого
класса нет - атрибуты исключения формируются
драйвером и включают текст сообщения,
исходное исключение DBAPI и объект соединения.
Синтаксис
from sqlalchemy.exc import InterfaceError
raise InterfaceError(statement, params, orig, connection_invalidated=False)
Пример
Давайте импортируем исключение и проверим его место в иерархии классов SQLAlchemy:
from sqlalchemy.exc import InterfaceError, DBAPIError, SQLAlchemyError
print(issubclass(InterfaceError, DBAPIError))
print(issubclass(InterfaceError, SQLAlchemyError))
print(issubclass(InterfaceError, Exception))
Результат выполнения кода:
True
True
True
Пример
Давайте попробуем выполнить запрос на уже
закрытом соединении. Драйвер SQLite возбудит
исключение, которое SQLAlchemy обернет в
InterfaceError:
Результат выполнения кода:
InterfaceError caught
ProgrammingError
Пример
Давайте перехватим InterfaceError как
более общий DBAPIError и выведем текст
исходного исключения драйвера:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import DBAPIError
engine = create_engine('sqlite:///:memory:')
conn = engine.connect()
conn.close()
try:
conn.execute(text('SELECT 1'))
except DBAPIError as err:
print('DBAPIError caught')
print('is instance of DBAPIError')
Результат выполнения кода:
DBAPIError caught
is instance of DBAPIError
Пример
Давайте поработаем с таблицей articles
и покажем, что корректный запрос не возбуждает
InterfaceError, а исключение появляется
только при проблемах интерфейса драйвера:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import InterfaceError
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT)'))
conn.execute(text("INSERT INTO articles (title) VALUES ('article')"))
conn.commit()
try:
res = conn.execute(text('SELECT title FROM articles'))
print(res.fetchall())
except InterfaceError as err:
print('InterfaceError:', err)
Результат выполнения кода:
[('article',)]
Смотрите также
-
класс
DBAPIError,
родительский класс для ошибок драйвера -
класс
SQLAlchemyError,
базовый класс всех исключений SQLAlchemy -
класс
OperationalError,
который сигнализирует об ошибках работы СУБД -
класс
ProgrammingError,
который указывает на ошибки программирования