提问人:AaA 提问时间:10/15/2023 最后编辑:AaA 更新时间:10/16/2023 访问量:81
无法在 python 中更新 sqlite3 数据库
Can't update the sqlite3 database in python
问:
我一直在使用 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)}')
输出
答:
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 ,并且您在参数元组中缺少 的值。,
WHERE
WHERE `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)}
es
Case
Case
Case ID
UPDATE
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(),
)
)
上一个:Python 消息框异常处理
评论
SET `Case ID` = ?