SQLAlchemy中的错误处理

70 投票
5 回答
121773 浏览
提问于 2025-04-15 18:28

在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中检查和处理错误!

真诚的,Boda Cydo。

5 个回答

12

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

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

我试了这个,结果给我显示了具体的错误信息。

from sqlalchemy.exc import SQLAlchemyError

try:
# try something

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

希望这能帮到你。

98

你的例子说:

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语句时,相关的语句和参数会在异常对象的 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 - 当无法找到被引用的 Column 时由 ForeignKey 抛出。
    • NoReferencedTableError - 当无法找到被引用的 Table 时由 ForeignKey 抛出。
    • NoSuchColumnError - 请求一个不存在的列时抛出。
    • 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 - 请求对未知实例进行映射操作。

撰写回答