于 2020 年 1 月 7 日更新
与数据库交互是一个容易出错的过程,因此我们必须始终实现某种机制来优雅地处理错误。
MySQLdb 具有MySQLdb.Error异常,这是一个顶级异常,可用于捕获MySQLdb模块引发的所有数据库异常。
from __future__ import print_functionimport MySQLdb as mytry:db = my.connect(host="127.0.0.1",user="root",passwd="",db="world")cursor = db.cursor()sql = "select * from city"number_of_rows = cursor.execute(sql)print(number_of_rows)db.close()except my.Error as e:print(e)except :print("Unknown error occurred")
MySQLdb 中的两个主要错误
需要注意的是,MySQLdb 中有两类异常类:
DatabaseErrorInterfaceError
DatabaseError:当数据处理中存在问题,sql 语法错误,mysql 内部问题时,引发此异常。 如果建立连接并且出现问题,则DatabaseError会捕获到它。InterfaceError:当由于某种原因数据库连接失败时,MySQLdb 将引发InterfaceError。 注意InterfaceError仅在与数据库连接存在内部问题时才引发,MySQLdb 不会因错误的数据库名称或密码而引发InterfaceError。
DatabaseError进一步分为 6 种类型:
DataErrorInternalErrorIntegrityErrorOperationalErrorNotSupportedErrorProgrammingError
DataError:当数据处理出现问题时,例如除以零,范围的数值,MySQLdb 会引发此错误。InternalError:当 MySQL 数据库本身存在一些内部错误时,引发此异常。 例如无效的游标,事务不同步等。IntegrityError:当外键检查失败时,引发此异常。OperationalError:对于不受程序员控制的事情,会引发此异常。 例如,意外断开连接,内存分配错误等,所选数据库不存在。NotSupportedError:当存在不支持的方法或 api 时,引发此异常。ProgrammingError:引发此编程错误。 例如找不到表,mysql 语法错误,指定的参数数量错误等。
from __future__ import print_functionimport MySQLdb as mytry:db = my.connect(host="127.0.0.1",user="root",passwd="",db="world")cursor = db.cursor()sql = "select * from city"number_of_rows = cursor.execute(sql)print(number_of_rows)db.close()except my.DataError as e:print("DataError")print(e)except my.InternalError as e:print("InternalError")print(e)except my.IntegrityError as e:print("IntegrityError")print(e)except my.OperationalError as e:print("OperationalError")print(e)except my.NotSupportedError as e:print("NotSupportedError")print(e)except my.ProgrammingError as e:print("ProgrammingError")print(e)except :print("Unknown error occurred")
在下一篇文章中,我们讨论如何从数据库中获取特定的行数。
