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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM