Исключение NotSupportedError
Исключение NotSupportedError относится к группе
DBAPIError и возникает в тех случаях, когда
база данных или ее драйвер не поддерживает
запрошенную возможность. Это может быть
неподдерживаемый тип данных, отсутствие
транзакций, невозможность выполнить
определенный DDL или DML-запрос. Исключение
наследуется от DBAPIError, поэтому его можно
перехватывать как через DBAPIError, так и
через базовый SQLAlchemyError.
Синтаксис
from sqlalchemy.exc import NotSupportedError
raise NotSupportedError(statement, params, orig)
Параметр statement содержит текст SQL-запроса,
параметр params хранит связанные параметры,
а orig - исходное исключение драйвера.
Пример
Давайте попробуем создать таблицу, в которой используется тип данных, не поддерживаемый выбранным диалектом, и перехватим исключение:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import NotSupportedError
engine = create_engine('sqlite:///:memory:')
try:
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER, num UNSIGNED BIG INT)'))
except NotSupportedError as e:
print('NotSupportedError:', e)
except Exception as e:
print('Other error:', type(e).__name__)
Результат выполнения кода:
"Other error: OperationalError"
В данном случае SQLite вернул ошибку синтаксиса,
которая транслировалась в OperationalError.
Однако на других СУБД подобная ситуация может
привести именно к NotSupportedError.
Пример
Давайте попробуем выполнить операцию, которая
не поддерживается драйвером, и обработаем
исключение через родительский класс
DBAPIError:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import DBAPIError, NotSupportedError
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT, num INTEGER)'))
conn.execute(text("INSERT INTO articles (title, num) VALUES ('article', 1)"))
try:
with engine.connect() as conn:
res = conn.execute(text('SELECT title, num FROM articles WHERE title LIKE ?'), ('article%',))
for row in res:
print(row)
except NotSupportedError as e:
print('NotSupportedError:', e)
except DBAPIError as e:
print('DBAPIError:', type(e).__name__)
Результат выполнения кода:
('article', 1)
Здесь запрос выполнился успешно, потому что
SQLite поддерживает параметризацию. Если бы
драйвер не поддерживал такой способ передачи
параметров, возникло бы исключение
NotSupportedError.
Пример
Давайте напишем функцию, которая явно
возбуждает исключение NotSupportedError
и демонстрирует его атрибуты:
from sqlalchemy.exc import NotSupportedError
statement = 'CREATE TABLE articles (id INTEGER, num MONEY)'
params = {}
orig = Exception('type MONEY is not supported')
try:
raise NotSupportedError(statement, params, orig)
except NotSupportedError as e:
print('statement:', e.statement)
print('params:', e.params)
print('orig:', e.orig)
Результат выполнения кода:
statement: CREATE TABLE articles (id INTEGER, num MONEY)
params: {}
orig: type MONEY is not supported
Пример
Давайте покажем, как отличить
NotSupportedError от других ошибок
DBAPIError при работе с моделями:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import NotSupportedError, DBAPIError
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER PRIMARY KEY, title TEXT, text TEXT, status TEXT, num INTEGER)'))
conn.execute(text("INSERT INTO articles (title, text, status, num) VALUES ('article', 'some text', 'draft', 1)"))
try:
with engine.connect() as conn:
res = conn.execute(text('SELECT title FROM articles'))
print([row[0] for row in res])
except NotSupportedError as e:
print('Operation is not supported:', e)
except DBAPIError as e:
print('Database error:', type(e).__name__)
Результат выполнения кода:
['article']
Смотрите также
-
исключение
DBAPIError,
базовый класс для ошибок драйвера базы данных -
исключение
OperationalError,
которое сигнализирует о проблемах работы СУБД -
исключение
UnsupportedCompilationError,
которое возникает при невозможности скомпилировать запрос -
исключение
SQLAlchemyError,
общий базовый класс всех исключений SQLAlchemy