Python+Tkinter对接MySQL 删除不存在数据无错误提示问题
问题原因
DELETE语句执行时只要语法正确就不会报错,哪怕WHERE条件没有匹配到任何记录,只会返回0条受影响行数。原代码没有校验操作实际影响的记录数,因此不管输入的名称是否存在,都会触发删除成功提示。另外原代码用字符串拼接构造SQL存在注入风险,修复时一并处理。
修复后完整代码
from tkinter import * import tkinter as tk from tkinter import filedialog import mysql.connector from tkinter import messagebox, simpledialog from tkinter.messagebox import askokcancel, showinfo, WARNING db = mysql.connector.connect( host="localhost", user="admin", passwd="test", database="dbpath" ) mycursor = db.cursor() mycursor.execute("CREATE DATABASE IF NOT EXISTS dbpath") mycursor.execute( "CREATE TABLE IF NOT EXISTS filepaths (id INT AUTO_INCREMENT PRIMARY KEY, path VARCHAR(255), name VARCHAR(255))") def confirmDeleteOne(): ROOT = tk.Tk() ROOT.withdraw() USER_INP = simpledialog.askstring(title="App Name", prompt="Insert the name of the app you want delete:") # 用户取消输入时直接返回 if not USER_INP: return answer = askokcancel( title='DELETION', message='Are you sure?\nTHIS IS AN IRREVERSIBLE ACTION', icon=WARNING) if answer: # 用参数化查询替代字符串拼接,避免SQL注入 mycursor.execute("DELETE FROM filepaths WHERE name = %s", (USER_INP,)) db.commit() # 校验实际删除的行数 if mycursor.rowcount == 0: showinfo( title='DELETION', message='THIS DOES NOT EXIST IN THE TABLE' ) else: showinfo( title='DELETION', message=f'SUCCESSFULLY DELETED {USER_INP.upper()}' ) root = Tk() deleteOne = Button(root, text="Delete One", command=confirmDeleteOne, bg='yellow', font="bold") deleteOne.pack() root.mainloop()
核心修改逻辑
- 增加空输入判断:用户点击输入框取消按钮时直接终止流程,不执行无效数据库操作
- 替换SQL构造方式:使用mysql连接器支持的
%s占位符做参数化查询,杜绝SQL注入风险 - 增加行数校验:执行删除并提交事务后,通过游标自带的
rowcount属性获取本次操作实际删除的记录数,行数为0时弹出记录不存在的提示,行数大于0时弹出删除成功提示
内容的提问来源于stack exchange,提问作者AfterHover
相关产品推荐
相关产品推荐

