You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:25:20