SQLAlchemy中的错误处理
在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语句时,相关的语句和参数会在异常对象的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
- 当无法找到被引用的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
- TODOUnmappedInstanceError
- 请求对未知实例进行映射操作。