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