SQLAlchemy中的错误处理

bod*_*ydo 40 python sqlalchemy

你如何处理SQLAlchemy中的错误?我对SQLAlchemy比较新,还不知道.

在我使用SQLAlchemy之前,我会做类似的事情

status = db.query("INSERT INTO users ...")
if (!status):
    raise Error, db.error
Run Code Online (Sandbox Code Playgroud)

但是现在我在SQLAlchemy编写代码并且我做了类似的事情

user = User('Boda Cydo')
session.add(user)
session.commit()
Run Code Online (Sandbox Code Playgroud)

没有任何错误检查!

我根本不喜欢这种编码风格而没有错误检查.

请咨询如何检查和处理SQLAlchemy中的错误!

真诚的,Boda Cydo.

nos*_*klo 62

你的例子说:

status = db.query("INSERT INTO users ...")
if (!status):
    raise Error, db.error
Run Code Online (Sandbox Code Playgroud)

这似乎意味着如果查询上有一些错误,你想要引发异常(with raise Error, db.error).然而sqlalchemy已经为你做到了 - 所以

user = User('Boda Cydo')
session.add(user)
session.commit()
Run Code Online (Sandbox Code Playgroud)

是一样的.检查和提升部分已经在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连接上检测到断开连接.由a引发,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- 从a请求不存在的列RowProxy.
    • NoSuchTableError - 表不存在或连接不可见.
    • NotSupportedError- 包装DB-API NotSupportedError.
    • OperationalError- 包装DB-API OperationalError.
    • ProgrammingError- 包装DB-API ProgrammingError.
    • SADeprecationWarning - 每次使用已弃用的API时发出一次.
    • SAPendingDeprecationWarning - 每次使用已弃用的API时发出一次.
    • SAWarning - 在运行时发布.
    • SADeprecationWarning - 通用错误类.
    • SAPendingDeprecationWarning - 在执行数据库操作失败时引发.
    • SAWarning - 连接池在获取连接时超时时触发.
    • SQLAlchemyError - 尝试在没有数据库连接的情况下执行SQL.
    • SQLError
  • TimeoutError:
    • UnboundExecutionError - 行已在工作单元之外进行了修改.
    • UnmappedColumnError - 在flush()期间检测到无效条件.
    • MultipleResultsFound - 需要单个数据库结果,但找到了多个数据库结果.
    • NoResultFound - 需要数据库结果但未找到.
    • sqlalchemy.orm.exc - refresh()操作无法重新检索对象的行.
    • ConcurrentModificationError - 请求未知类的映射操作.
    • FlushError - 在未知列上请求映射操作.
    • flush() - 去做
    • MultipleResultsFound - 请求了未知实例的映射操作.


Tou*_*fiq 8

我试过了,它向我显示了特定的错误消息。

from sqlalchemy.exc import SQLAlchemyError

try:
# try something

except SQLAlchemyError as e:
  error = str(e.__dict__['orig'])
  return error
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助

  • error = str(e.orig) 也可以 (7认同)

Moi*_*ikh 5

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

首先,从sqlalchemy导入exc

from sqlalchemy import exc
Run Code Online (Sandbox Code Playgroud)

要捕获错误类型:

    try:
        # any query
    except exc.SQLAlchemyError as e:
        print(type(e))
Run Code Online (Sandbox Code Playgroud)

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

<class 'sqlalchemy.exc.IntegrityError'>
<class 'sqlalchemy.exc.IntegrityError'>
Run Code Online (Sandbox Code Playgroud)