Python 消息框异常处理

Python messagebox exception handling

提问人:AaA 提问时间:10/25/2023 最后编辑:XMehdi01AaA 更新时间:10/26/2023 访问量:52

问:

我一直在使用 sqlite3 开发一个 python 项目,它允许用户更新、删除和搜索数据库中的数据。对于选择过程,要求用户根据要进行选择的列名从数据库表中选择列名。我正在选择列并键入要搜索的值,但程序消息框显示异常错误。数据库名称为 。criminal_records

我应该如何更新代码以应对异常?

def search_data(self): 
    if self.var_search.get()=="":
        messagebox.showerror('Error','Please enter a search term')
    else:
        try:
            conn=sqlite3.connect('criminal_records.db')
            my_cursor=conn.cursor()
            my_cursor.execute("SELECT * FROM criminal_records WHERE "+str(self.var_com_search.get())+" LIKE '%"+str(self.var_search.get()+"'%"))
            rows=my_cursor.fetchall()
  
            if len(rows)!= 0:
                self.criminal_table.delete(*self.criminal_table.get_children())
                for i in rows:
                    self.criminal_table.insert('',END,values=i)
            conn.commit()
            conn.close()
        except Exception as es:
            messagebox.showerror('Error',f'Due to{str(es)}')    

how it looks.

python 异常 tkinter sqlite3-python

评论

0赞 DerSchinken 10/25/2023
尝试:my_cursor.execute("SELECT * FROM criminal_records WHERE ? LIKE '%?'%", (self.var_com_search.get(), self.var_search.get()))
0赞 DerSchinken 10/25/2023
我刚刚意识到我只是自己犯了错误,你需要把最后一个放到 s 中,比如:%''%?%'
0赞 acw1668 10/25/2023
将 SQL 语句分配给变量并打印该变量的值,以查看最终的 SQL 语句是否正确。
0赞 AaA 10/26/2023
它再次显示错误“由于绑定数量不完整,2 个中提供了 1 个”

答:

0赞 acw1668 10/26/2023 #1

如果将最终的 SQL 语句保存到变量中并打印出来:

sql = "SELECT * FROM criminal_records WHERE "+str(self.var_com_search.get())+" LIKE '%"+str(self.var_search.get()+"'%")
print(sql)

您将获得(基于您提供的图像):

SELECT * FROM criminal_records WHERE Case ID LIKE '%12789250'%

上面的 SQL 语句有两个问题:

  • 列名不带引号Case ID
  • last 不在单引号字符串内%

最好对搜索字符串使用占位符(请注意,不能在列名上使用占位符),并将列名嵌入双引号内:

sql = f"""SELECT * FROM criminal_records WHERE "{self.var_com_search.get()}" LIKE ?"""
my_cursor.execute(sql, (f"%{self.var_search.get()}%",))

请注意,的值来自组合框小部件的预定义值,这不会导致 SQL 注入。self.var_com_search

评论

0赞 AaA 10/26/2023
非常感谢您的帮助!我能够修复代码,现在运行平稳。