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

Python2.7+PyQt4.10中捕获Sqlite外键删除错误并弹出GUI提示

解决PyQt4+SQLite3外键关联下的父记录删除校验问题

我来帮你搞定这个删除时的提示逻辑,结合你的代码片段,咱们一步步完善:

首先要注意,SQLite默认是关闭外键约束的,所以第一步得先开启它,不然外键关联不会生效:

# 初始化数据库连接时开启外键
conn = sqlite3.connect('your_database.db')
conn.execute("PRAGMA foreign_keys = ON")

接下来,在执行删除操作前,先查询子表是否存在关联记录。假设你的父表是categories(对应你代码里的"فئة",也就是分类),子表是sub_items,外键是category_id关联父表的id字段:

# 获取要删除的父记录文本(比如分类名称)
deleted1 = self.listWidget.currentItem().text()
deleted = unicode(deleted1)

# 先查询父记录的ID(假设父表有name和id字段)
cursor = conn.cursor()
cursor.execute("SELECT id FROM categories WHERE name = ?", (deleted,))
category_id = cursor.fetchone()

if category_id:
    category_id = category_id[0]
    # 检查子表是否有关联数据
    cursor.execute("SELECT COUNT(*) FROM sub_items WHERE category_id = ?", (category_id,))
    count = cursor.fetchone()[0]
    
    if count > 0:
        # 子表有数据,弹出错误提示
        error_title = u'خطأ'  # 错误
        error_msg = u'لا يمكن حذف هذه الفئة، حيث تحتوي على عناصر مرتبطة بها'  # 无法删除该分类,因为有相关联的项目
        QtGui.QMessageBox.critical(self, error_title, error_msg)
    else:
        # 没有关联数据,弹出确认提示
        quit_title = u'تأكيد'
        quit_msg = u'هل انت متأكد من مسح الفئة ' + deleted
        result = QtGui.QMessageBox.question(self, quit_title, quit_msg, 
                                           QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
        if result == QtGui.QMessageBox.Yes:
            # 执行删除操作
            cursor.execute("DELETE FROM categories WHERE id = ?", (category_id,))
            conn.commit()
            # 更新列表控件,移除已删除的项
            self.listWidget.takeItem(self.listWidget.currentRow())
else:
    # 未找到对应记录,提示
    QtGui.QMessageBox.warning(self, u'تحذير', u'الفئة المحددة غير موجودة')

几个关键细节说明:

  • 用unicode()处理阿拉伯文本是Python2.7里的正确做法,能避免编码乱码问题
  • 一定要先开启SQLite的外键约束,不然即使建表时定义了外键,数据库也不会自动执行关联校验
  • 先查询子表计数再决定是否允许删除,比依赖数据库抛出异常再捕获更友好,能提前给用户直观的GUI提示
  • 确认删除后记得更新listWidget,让界面显示和数据库状态保持一致

内容的提问来源于stack exchange,提问作者Ahmed Wagdi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:58:54