如何处理 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
!
你的例子说:
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
- TODOUnmappedInstanceError
- 为未知实例请求映射操作。我尝试了这个,它向我显示了具体的错误消息。
from sqlalchemy.exc import SQLAlchemyError
try:
# try something
except SQLAlchemyError as e:
error = str(e.__dict__['orig'])
return error
希望这有帮助
要获取异常类型,您只需调用:
首先,从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'>
我对 SQLAlchemy 中处理错误的两点看法:一个简单的 python 的 try- except 将不起作用,因为 MySQL 是持久的。例如,如果您尝试向数据库插入一条记录,但它是重复的,程序将采取异常路线,但MySQL将根据未执行的插入命令而停止。避免将 try-except 与 SQLAlchemy 命令结合使用,或为这些情况做好准备。
SQLAlchemy 将引发错误异常....