Подтвердить что ты не робот

Обработка ошибок в SQLAlchemy

Как вы обрабатываете ошибки в SQLAlchemy? Я относительно новичок в SQLAlchemy и пока не знаю.

Прежде чем использовать SQLAlchemy, я бы сделал что-то вроде

status = db.query("INSERT INTO users ...")
if (!status):
    raise Error, db.error

Но теперь я кодирую в SQLAlchemy, и я делаю что-то вроде

user = User('Boda Cydo')
session.add(user)
session.commit()

Нет ошибок при проверке!

Мне не нравится этот стиль кодирования без проверки ошибок.

Проконсультируйтесь о том, как проверять и обрабатывать ошибки в SQLAlchemy!

С уважением, Бода Сидо.

4b9b3361

Ответ 1

Ваш пример говорит:

status = db.query("INSERT INTO users ...")
if (!status):
    raise Error, db.error

Похоже, это означает, что вы хотите вызвать исключение, если в запросе есть какая-то ошибка (с raise Error, db.error). Однако sqlalchemy уже делает это для вас - так

user = User('Boda Cydo')
session.add(user)
session.commit()

Это то же самое. Часть проверки и повышения уже находится внутри SQLAlchemy.

Вот список ошибок, которые может вызвать sqlalchemy, взятых из help(sqlalchemy.exc) и help(sqlalchemy.orm.exc):

  • sqlalchemy.exc:
    • ArgumentError - Возникает, когда указан неверный или конфликтующий аргумент функции. Эта ошибка обычно соответствует ошибкам состояния времени строительства.
    • CircularDependencyError - Возникает при топологических сортировках при обнаружении циклической зависимости
    • CompileError - возникает при возникновении ошибки во время компиляции SQL
    • ConcurrentModificationError
    • DBAPIError - Возникает при сбое выполнения операции базы данных. Если во время выполнения SQL произошла операция поднятия ошибки Заявление, что выражение и его параметры будут доступны на объект исключения в атрибутах statement и params. Обернутый объект исключения доступен в атрибуте orig. Его тип и свойства зависят от реализации DB-API.
    • DataError Обертывает DB-API DataError.
    • DatabaseError - переносит DB-API DatabaseError.
    • DisconnectionError - Обнаружено разъединение в необработанном соединении DB-API. быть поднятым PoolListener, чтобы пул хостов принудительно отключался.
    • FlushError
    • IdentifierError - Возникает, когда имя схемы превышает максимально допустимое количество символов
    • IntegrityError - переносит DB-API IntegrityError.
    • InterfaceError - Обертка DB-API InterfaceError.
    • InternalError - переносит DB-API InternalError.
    • InvalidRequestError - SQLAlchemy попросили сделать что-то, чего он не может. Эта ошибка обычно соответствует ошибкам состояния во время выполнения.
    • NoReferenceError - Поднято ForeignKey, чтобы указать, что ссылка не может быть разрешена.
    • NoReferencedColumnError - Вызывается ForeignKey, когда упомянутый Column не может быть найден.
    • NoReferencedTableError - Вызывается ForeignKey, когда упомянутый Table не может быть найден.
    • NoSuchColumnError - из RowProxy запрашивается несуществующий столбец.
    • NoSuchTableError - Таблица не существует или не видна для соединения.
    • NotSupportedError - переносит DB-API NotSupportedError.
    • OperationalError - переносит DB-API OperationalError.
    • ProgrammingError - переносит DB-API ProgrammingError.
    • SADeprecationWarning - выдается один раз за использование устаревшего API.
    • SAPendingDeprecationWarning - выдается один раз за использование устаревшего API.
    • SAWarning - Выдается во время выполнения.
    • SQLAlchemyError - Общий класс ошибок.
    • SQLError - Возникает при сбое выполнения операции с базой данных.
    • TimeoutError - Возникает, когда пул соединений теряет время при получении соединения.
    • UnboundExecutionError - была предпринята попытка выполнить SQL без подключения к базе данных.
    • UnmappedColumnError
  • sqlalchemy.orm.exc:
    • ConcurrentModificationError - Ряды были изменены за пределами единицы работы.
    • FlushError - во время flush() обнаружено недопустимое состояние.
    • MultipleResultsFound - Требуется один результат для базы данных, но найдено более одного.
    • NoResultFound - Требуется результат для базы данных, но ничего не найдено.
    • ObjectDeletedError - Операция refresh() не смогла повторно получить строку объекта.
    • UnmappedClassError - Запрошена операция сопоставления для неизвестного класса.
    • UnmappedColumnError - Операция сопоставления была запрошена для неизвестного столбца.
    • UnmappedError - TODO
    • UnmappedInstanceError - Операция сопоставления была запрошена для неизвестного экземпляра.

Ответ 2

Я попробовал это, и он показал мне конкретное сообщение об ошибке.

from sqlalchemy.exc import SQLAlchemyError

try:
# try something

except SQLAlchemyError as e:
  error = str(e.__dict__['orig'])
  return error

Надеюсь это поможет

Ответ 3

SQLAlchemy вызовет исключение при ошибке....