pymysql.err.IntegrityError: (1062, “Duplicate entry ‘ ‘ for key ‘PRIMARY‘“)
在python中用insert into写入mysql数据库时,可能会出现如题所示异常。
当然,如何改是属于数据方面的知识,网上有很多,不在这里述说。
本文要解决的是:如何在程序中获取该错误,并进行异常处理。
一、捕获异常。
常用方法:
当然在程序调试过程中出现该异常,用肉眼来看就行了。在程序中就需要捕获该异常。参考Python3 MySQL 数据库连接 - PyMySQL 驱动中的代码:
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 插入语句 sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try: # 执行sql语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except: # 如果发生错误则回滚 db.rollback() # 关闭数据库连接 db.close() 以上代码可以应付大多数程序场景。
二、异常处理
在捕获异常后,异常有很多种,只对感兴趣(或者说:能处理的)异常进行处理。比如如题所示的异常。一般情况下程序中遇到这种异常,可以忽略。于是以上代码就可以进行修改
首先,为了能获取异常原因,就要把except:改为except Exception as err:
其次,为了识别出是能处理的原因,可以使用正则表达式来匹配异常原因是感兴趣的,而不是别的原因。这中间有个问题:上句中err的类型是pymysql.err.IntegrityError对象。而正则表达式只能处理string类型,所以需要把pymysql.err.IntegrityError对象转变为string对象。幸运的是python有个很好用的函数str()。
最后上改过后的代码
#!/usr/bin/python3 # -*- coding: utf-8 -*- import pymysql # 打开数据库连接 db = pymysql.connect("localhost","testuser","test123","TESTDB" ) # 使用cursor()方法获取操作游标 cursor = db.cursor() # SQL 插入语句 sql = """INSERT INTO EMPLOYEE(FIRST_NAME, LAST_NAME, AGE, SEX, INCOME) VALUES ('Mac', 'Mohan', 20, 'M', 2000)""" try: # 执行sql语句 cursor.execute(sql) # 提交到数据库执行 db.commit() except Exception as err: #检查异常原因是否是感兴趣的 result1 =re.search('Duplicate entry.*key.*PRIMARY', str(err)) #如果是,什么都不用做 #否则(也不知道是什么原因),那就回滚吧 if(result1 ==None): # 如果发生错误则回滚 db.rollback() # 关闭数据库连接 db.close()