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