sqlite3.IntegrityError触发时消息框无法正常显示的问题排查
问题描述
希望触发sqlite3.IntegrityError时弹出消息框,但该功能无法正常工作,已尝试使用try-except语句及if-else逻辑处理,代码如下:
原始代码
def data_b(*args): import sqlite3 conection = sqlite3.Connection('annuaire_telephobque.db') cursorr = conection.cursor() cursorr.execute("CREATE TABLE IF NOT EXISTS a_t_users(row_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,user_f_name TEXT NOT NULL UNIQUE, user_l_name TEXT NOT NULL UNIQUE ,use_number TEXT NOT NULL UNIQUE)") f_get=str(nam0.get()) l_get=str(l_nam0.get()) n_get=str(numero0.get()) try: cursorr = conection.cursor() cursorr.execute("INSERT INTO a_t_users (user_f_name, user_l_name ,use_number) VALUES (?,?,?)",(f_get,l_get,n_get)) conection.commit() except sqlite3.IntegrityError: cursorr.close() conection.commit() conection.close() print('karim') messagebox.showerror(title='error',message='les information existes deja')
问题分析与修复方案
核心问题1:未导入messagebox模块
代码中调用了messagebox.showerror()但未导入该模块,messagebox是Tkinter的子模块,必须显式导入才能使用。
核心问题2:数据库连接/游标处理不当
- except块中执行
conection.commit()无意义,插入操作已失败,无需提交;反而应回滚事务(conection.rollback())避免事务异常。 - 重复创建游标属于冗余操作,初始已创建过游标。
- 手动关闭连接和游标易遗漏,建议用上下文管理器(
with语句)自动管理,更安全可靠。
修正后的代码
from tkinter import messagebox # 必须导入messagebox模块 import sqlite3 def data_b(*args): # 用上下文管理器自动管理数据库连接,无需手动关闭 with sqlite3.Connection('annuaire_telephobque.db') as conection: cursorr = conection.cursor() cursorr.execute("CREATE TABLE IF NOT EXISTS a_t_users(row_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL ,user_f_name TEXT NOT NULL UNIQUE, user_l_name TEXT NOT NULL UNIQUE ,use_number TEXT NOT NULL UNIQUE)") f_get = str(nam0.get()) l_get = str(l_nam0.get()) n_get = str(numero0.get()) try: cursorr.execute("INSERT INTO a_t_users (user_f_name, user_l_name ,use_number) VALUES (?,?,?)",(f_get,l_get,n_get)) conection.commit() except sqlite3.IntegrityError: conection.rollback() # 回滚失败的事务 print('karim') messagebox.showerror(title='错误', message='该信息已存在')
额外检查点
- 确认
nam0、l_nam0、numero0是有效的Tkinter控件,且get()能正确获取输入内容。 - 测试时确保输入内容确实违反表的UNIQUE约束(比如插入已存在的用户名或电话号码),验证异常是否被触发。
内容的提问来源于stack exchange,提问作者midou
相关产品推荐
相关产品推荐

