Python中SQLite3数据库无法更新问题求助(附Tkinter代码)
问题描述
我用Tkinter开发Python项目,搭配SQLite3数据库(表名criminal_records),但数据库更新功能一直弹出异常错误,就算移除异常处理代码,数据库也没法更新。更新功能代码如下:
#update code def update_data(self): if self.var_case_id.get()=="": messagebox.showerror('Error','All fields are required') else: try: update=messagebox.askyesno('Update', "Are you sure you want to update this record?") if update>0: conn=sqlite3.connect('criminal_records.db') my_cursor=conn.cursor() my_cursor.execute('UPDATE criminal_records SET Case ID=?, Criminal Name=?,Case Number=?,Date of crime=?, Crime Type=?, Description=?,Block=?,Location=?,Arrest Date=?, Age=?, Gender=?, WHERE Case Id=?', ( self.var_case_id.get(), self.var_name.get(), self.var_case_number.get(), self.var_date_of_crime.get(), self.var_crime_type.get(), self.var_description.get(), self.var_block.get(), self.var_location.get(), self.var_arrest_date.get(), self.var_age.get(), self.var_gender.get(), )) else: if not update: return conn.commit() self.fetch_data() self.clear_data() conn.close() messagebox.showinfo('Successful', 'Criminal record has been updated') except Exception as es: messagebox.showerror('Error',f'Due to{str(es)}')
报错截图:
问题分析与修复
你的代码存在几个关键错误,导致SQL执行失败:
SQL语法错误:字段名含空格未转义
SQLite中,包含空格的字段名需要用双引号"包裹,否则会被解析为多个关键字,引发语法错误。比如Case ID要写成"Case ID"。UPDATE语句多了逗号
Gender=?, WHERE这里的逗号多余,直接去掉逗号,改成Gender=? WHERE。参数数量不匹配
SQL语句里有12个占位符(SET子句11个,WHERE子句1个),但你只传入了11个参数,缺少WHERE条件对应的Case Id值,需要在参数末尾加上self.var_case_id.get()。逻辑错误:连接操作范围错误
当用户点击取消(update为False)时,代码会直接执行conn.commit()和conn.close(),但此时conn还没创建,会引发新的错误。需要把提交、关闭连接、刷新数据这些操作放到if update:的代码块内。布尔值判断错误
messagebox.askyesno()返回的是布尔值True/False,直接用if update:判断即可,不用update>0。
修正后的代码
def update_data(self): if self.var_case_id.get() == "": messagebox.showerror('Error', 'All fields are required') else: try: update = messagebox.askyesno('Update', "Are you sure you want to update this record?") if update: conn = sqlite3.connect('criminal_records.db') my_cursor = conn.cursor() # 修正字段名转义、多余逗号,补充缺失的参数 my_cursor.execute('''UPDATE criminal_records SET "Case ID"=?, "Criminal Name"=?, "Case Number"=?, "Date of crime"=?, "Crime Type"=?, Description=?, Block=?, Location=?, "Arrest Date"=?, Age=?, Gender=? WHERE "Case Id"=?''', ( self.var_case_id.get(), self.var_name.get(), self.var_case_number.get(), self.var_date_of_crime.get(), self.var_crime_type.get(), self.var_description.get(), self.var_block.get(), self.var_location.get(), self.var_arrest_date.get(), self.var_age.get(), self.var_gender.get(), self.var_case_id.get() # 补充WHERE条件的参数 )) conn.commit() self.fetch_data() self.clear_data() conn.close() messagebox.showinfo('Successful', 'Criminal record has been updated') else: return except Exception as es: messagebox.showerror('Error', f'Due to {str(es)}') # 加空格优化提示可读性
内容的提问来源于stack exchange,提问作者AaA
相关产品推荐
相关产品推荐

