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
相关产品推荐
相关产品推荐

