Исключение NoSuchColumnError
Исключение NoSuchColumnError наследуется от
SQLAlchemyError
и возбуждается, когда код пытается получить доступ
к столбцу, которого нет в результате выполнения
запроса. Чаще всего это происходит при работе
с объектом Row или CursorResult,
когда имя столбца указано с опечаткой либо
столбец не был включен в SELECT-список.
Исключение не принимает дополнительных параметров
и содержит сообщение с именем отсутствующего
столбца.
Синтаксис
NoSuchColumnError(statement, params, orig)
Пример
Давайте получим строку из таблицы и попробуем обратиться к несуществующему столбцу, чтобы увидеть исключение:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER, title TEXT)'))
conn.execute(text("INSERT INTO articles VALUES (1, 'article')"))
conn.commit()
res = conn.execute(text('SELECT id, title FROM articles'))
row = res.first()
print(row.title)
print(row.text)
Результат выполнения кода:
article
Traceback (most recent call last):
...
sqlalchemy.exc.NoSuchColumnError: "Could not locate column in row for column 'text'"
Пример
Давайте обработаем исключение через конструкцию
try/except, чтобы вернуть значение
по умолчанию:
from sqlalchemy import create_engine, text
from sqlalchemy.exc import NoSuchColumnError
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER, title TEXT)'))
conn.execute(text("INSERT INTO articles VALUES (1, 'article')"))
conn.commit()
res = conn.execute(text('SELECT id, title FROM articles'))
row = res.first()
try:
print(row.status)
except NoSuchColumnError as exc:
print('column missing:', exc)
Результат выполнения кода:
"column missing: Could not locate column in row for column 'status'"
Пример
Давайте проверим наличие столбца через атрибут
_mapping перед обращением к нему:
from sqlalchemy import create_engine, text
engine = create_engine('sqlite:///:memory:')
with engine.connect() as conn:
conn.execute(text('CREATE TABLE articles (id INTEGER, title TEXT, num INTEGER)'))
conn.execute(text("INSERT INTO articles VALUES (1, 'article', 10)"))
conn.commit()
res = conn.execute(text('SELECT id, title, num FROM articles'))
row = res.first()
for name in ('id', 'title', 'text'):
if name in row._mapping:
print(name, '=', row._mapping[name])
else:
print(name, 'not found')
Результат выполнения кода:
id = 1
title = article
text not found
Смотрите также
-
класс
SQLAlchemyError,
который является базовым исключением библиотеки -
класс
StatementError,
который оборачивает ошибки выполнения запросов -
класс
InvalidRequestError,
который сигнализирует о некорректном запросе -
класс
ResourceClosedError,
который возбуждается при работе с закрытым ресурсом