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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 21:47:33