Обработка ошибок в SQLAlchemy - PullRequest
37 голосов
/ 26 января 2010

Как вы обрабатываете ошибки в 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!

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

Ответы [ 3 ]

60 голосов
/ 26 января 2010

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

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 - Во время сброса () обнаружено недопустимое состояние.
    • MultipleResultsFound - Требуется один результат для базы данных, но найдено более одного.
    • NoResultFound - Требуется результат для базы данных, но ничего не найдено.
    • ObjectDeletedError - Операция refresh () не смогла повторно получить строку объекта.
    • UnmappedClassError - Запрошена операция сопоставления для неизвестного класса.
    • UnmappedColumnError - Операция сопоставления была запрошена для неизвестного столбца.
    • UnmappedError - TODO
    • UnmappedInstanceError - Операция сопоставления была запрошена для неизвестного экземпляра.
2 голосов
/ 08 декабря 2018

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

from sqlalchemy.exc import SQLAlchemyError

try:
# try something

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

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

2 голосов
/ 26 января 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...