如何检查和处理SQLAlchemy中的错误

问题描述 投票:0回答:5

如何处理 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
5个回答
100
投票

你的例子说:

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
      - 为未知实例请求映射操作。

49
投票

我尝试了这个,它向我显示了具体的错误消息。

from sqlalchemy.exc import SQLAlchemyError

try:
# try something

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

希望这有帮助


14
投票

要获取异常类型,您只需调用:

首先,从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'>

1
投票

我对 SQLAlchemy 中处理错误的两点看法:一个简单的 python 的 try- except 将不起作用,因为 MySQL 是持久的。例如,如果您尝试向数据库插入一条记录,但它是重复的,程序将采取异常路线,但MySQL将根据未执行的插入命令而停止。避免将 try-except 与 SQLAlchemy 命令结合使用,或为这些情况做好准备。


-2
投票

SQLAlchemy 将引发错误异常....

© www.soinside.com 2019 - 2024. All rights reserved.