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编译期间发生错误时引发ConcurrentModificationErrorDBAPIError - 在执行数据库操作失败时引发.如果在执行SQL语句时发生了错误提升操作,则该语句及其参数将在statement和params属性中的异常对象上可用.包装的异常对象在orig属性中可用.它的类型和属性是特定于DB-API的实现.DataError包装DB-API DataError.DatabaseError- 包装DB-API DatabaseError.DisconnectionError - 在原始DB-API连接上检测到断开连接.由a引发,PoolListener以便主机池强行断开连接.FlushErrorIdentifierError - 当架构名称超出最大字符限制时引发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 - 通用错误类.SAPendingDeprecationWarning - 在执行数据库操作失败时引发.SAWarning - 连接池在获取连接时超时时触发.SQLAlchemyError - 尝试在没有数据库连接的情况下执行SQL.SQLErrorTimeoutError:
UnboundExecutionError - 行已在工作单元之外进行了修改.UnmappedColumnError - 在flush()期间检测到无效条件.sqlalchemy.orm.exc - refresh()操作无法重新检索对象的行.ConcurrentModificationError - 请求未知类的映射操作.FlushError - 在未知列上请求映射操作.flush() - 去做MultipleResultsFound - 请求了未知实例的映射操作.我试过了,它向我显示了特定的错误消息。
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)
希望这可以帮助
要获取异常类型,您可以简单地调用:
首先,从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)