无法在 python 中更新 sqlite3 数据库

Can't update the sqlite3 database in python

提问人:AaA 提问时间:10/15/2023 最后编辑:AaA 更新时间:10/16/2023 访问量:81

问:

我一直在使用 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)}')  

输出This is the output I am getting.

python tkinter sqlite3-python

评论

0赞 Barmar 10/15/2023
如果列名中包含空格,则必须将其放在反引号中:SET `Case ID` = ?

答:

0赞 Barmar 10/15/2023 #1

您必须将包含带反引号的空格的列名引用起来。

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`=?, (

您还有一个额外的 before ,并且您在参数元组中缺少 的值。,WHEREWHERE `Case ID`=?

评论

0赞 AaA 10/15/2023
谢谢你的建议。但是,更新后,消息框显示“由于提供的绑定数不正确。当前语句使用 12 个,并且提供了 11 个。我的数据库有 11 列。
0赞 acw1668 10/16/2023
@AaA 但是 SQL 语句中有 12 个占位符,其中有 11 列要更新,WHERE 子句中有 1 个占位符。实际上,您不需要更新列,因为它是搜索条件。Case ID
0赞 AaA 10/16/2023
@Barmar好吧!会调查的。
0赞 Barmar 10/17/2023
你没读过答案的最后一部分吗?我说你缺少一个值。
0赞 richyen 10/15/2023 #2

屏幕截图中的错误消息来自代码,意思是“near : syntax error” 附近有一个语法错误,因为您的列是 ,其中包含一个空格,但该空格未在您的语句中处理(以及其他列也是如此)。应将列封装在单引号或双引号中:Due to{str(es)}esCaseCaseCase IDUPDATE

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"=?

注意:我之前也删除了多余的逗号WHERE

0赞 acw1668 10/16/2023 #3

您的 SQL 语句中存在问题:

  • 需要用双引号将这些列名用空格括起来
  • WHERE 前加逗号

此外,提供的值数 (11) 与 SQL 语句中的占位符数 (12) 不匹配。

实际上,您不需要更新该列,因为它是搜索条件。"Case ID"

下面是更新的 SQL 语句,具有正确的顺序和提供的值的数量:

my_cursor.execute('''\
    UPDATE criminal_records
    SET "Criminal Name" = ?,
        "Case Number" = ?,
        "Date of crime" = ?,
        "Crime Type" = ?,
        "Description" = ?,
        "Block" = ?,
        "Location" = ?,
        "Arrest Date" = ?,
        "Age" = ?,
        "Gender" = ?
    WHERE "Case ID" = ?''',
    (
        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(),
    )
)