【问题标题】:Error handling in SQLAlchemySQLAlchemy 中的错误处理
【发布时间】:2010-01-26 00:21:29
【问题描述】:

您如何处理 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 中的错误提出建议!

此致,博达·赛多。

【问题讨论】:

标签: python sqlalchemy


【解决方案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()

是一样的。 check-and-raise 部分已经在 SQLAlchemy 中。

以下是 sqlalchemy 本身可能引发的错误列表,取自 help(sqlalchemy.exc)help(sqlalchemy.orm.exc)

  • sqlalchemy.exc:
    • ArgumentError - 在提供无效或冲突的函数参数时引发。 此错误通常对应于构建时状态错误。
    • CircularDependencyError - 检测到循环依赖时由拓扑排序引发
    • CompileError - 在 SQL 编译期间发生错误时引发
    • ConcurrentModificationError
    • DBAPIError - 在数据库操作执行失败时引发。 如果在执行 SQL 时发生错误引发操作 语句,该语句及其参数将在 statementparams 属性中的异常对象。 包装的异常对象在 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 - 当被推荐的Table 找不到时由ForeignKey 提出。
    • 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 - 待办事项
    • UnmappedInstanceError - 为未知实例请求映射操作。

【讨论】:

    【解决方案2】:

    我试过了,它显示了具体的错误消息。

    from sqlalchemy.exc import SQLAlchemyError
    
    try:
    # try something
    
    except SQLAlchemyError as e:
      error = str(e.__dict__['orig'])
      return error
    

    希望对你有帮助

    【讨论】:

    • error = str(e.orig) 也可以
    【解决方案3】:

    要获取异常类型,您可以简单地调用:

    首先,从 sqlalchemy 导入 exc

    from sqlalchemy import exc
    

    捕捉错误类型:

        try:
            # any query
        except exc.SQLAlchemyError as e:
            print(type(e))
    

    这将为您提供异常类型: 输出:

    <class 'sqlalchemy.exc.IntegrityError'>
    <class 'sqlalchemy.exc.IntegrityError'>
    

    【讨论】:

      【解决方案4】:

      SQLAlchemy 会在出错时引发异常......

      【讨论】:

      • 例外情况在两个不同的模块中——sqlalchemy.exc 和 sqlalchemy.orm.exc。发生错误时会自动引发异常,这与示例中的代码不同,您必须自己执行此操作...
      猜你喜欢
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 2016-02-20
      • 2022-07-19
      • 2012-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多