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()

  

posted @ 2021-04-09 21:42  zhw_sylvia  阅读(3726)  评论(0编辑  收藏  举报