Python sqlite3罪犯记录数据库搜索功能异常处理优化咨询
问题分析与代码修正
你的搜索功能弹出异常,主要由几个明确问题导致,对应修正方案如下:
1. SQL语句拼接语法错误
原代码中LIKE子句的引号闭合逻辑错误:
my_cursor.execute("SELECT * FROM criminal_records WHERE "+str(self.var_com_search.get())+" LIKE '%"+str(self.var_search.get()+"'%"))
这里把闭合引号写进了get()方法的参数里,直接导致SQL语法报错。需要调整引号的拼接位置,确保搜索值前后的百分号正确包裹。
2. 存在SQL注入风险
直接拼接用户选择的列名和输入的搜索值,可能引发SQL注入问题(即使是桌面程序,也应遵循安全编码规范)。需要先验证列名的合法性,搜索值则用参数化查询传递。
3. 冗余的commit()操作
查询操作不需要调用conn.commit(),该方法仅用于提交增、删、改类的事务,查询调用它完全多余。
4. 数据库连接未安全管理
原代码手动关闭连接,若执行过程中抛出异常,可能导致连接未正常关闭。建议用with语句自动管理连接生命周期。
5. 异常提示格式问题
f'Due to{str(es)}'缺少空格,显示效果生硬,应调整为f'Due to {str(es)}'。
修改后的完整代码
def search_data(self): search_term = self.var_search.get().strip() if not search_term: messagebox.showerror('Error','Please enter a search term') return # 验证选择的列名是否合法,替换为你表中实际存在的列名 valid_columns = ['id', 'name', 'crime_type', 'case_date'] selected_column = self.var_com_search.get() if selected_column not in valid_columns: messagebox.showerror('Error','Invalid column selected') return try: # with语句自动管理连接,无需手动关闭 with sqlite3.connect('criminal_records.db') as conn: my_cursor = conn.cursor() # 列名提前验证后拼接,搜索值用参数化占位符 sql = f"SELECT * FROM criminal_records WHERE {selected_column} LIKE ?" # 把搜索值用%包裹后作为参数传入 my_cursor.execute(sql, ('%' + search_term + '%',)) rows = my_cursor.fetchall() if rows: # 直接判断结果是否非空,代码更简洁 self.criminal_table.delete(*self.criminal_table.get_children()) for row in rows: self.criminal_table.insert('', END, values=row) except Exception as es: messagebox.showerror('Error', f'Due to {str(es)}')
关键修改说明
- 列名合法性校验:通过
valid_columns列表限制用户只能选择表中存在的列,避免非法列名导致的SQL错误。 - 参数化查询:搜索值用
?作为占位符传递,彻底规避SQL注入风险。 - 自动管理连接:
with块结束后自动关闭数据库连接,避免资源泄漏。 - 优化输入判断:用
strip()去除搜索值前后空白,避免用户输入无效空白字符。 - 简化逻辑判断:用
if rows:替代if len(rows)!=0:,代码更简洁直观。
内容的提问来源于stack exchange,提问作者AaA
相关产品推荐
相关产品推荐

