【发布时间】:2018-02-14 00:22:10
【问题描述】:
所以我在尝试在这个 Python 数据库 GUI 的 Tkinter 界面上编辑记录时遇到问题,我在其中使用 Treeview 和 SQLite。我正在尝试选择现有记录之一,并在弹出窗口中编辑数据,并让原始数据被新数据覆盖。我收到此错误query_result = cursor.execute(query, parameters) sqlite3.OperationalError: near ",": syntax error
这是我的代码,不确定我是否添加了不需要的参数,不胜感激。下面的代码在一个类中,根据需要缩进并具有功能代码,只是不需要包含问题。
问题出在这部分代码中,但不确定是哪一部分!
def editing(self):
self.message['text'] = ''
try:
self.tree.item(self.tree.selection())['values'][0]
except IndexError as e:
self.message['text'] = 'Please, select record!'
return
name = self.tree.item(self.tree.selection())['text']
current_position = self.tree.item(self.tree.selection())['values'][0]
current_gamesplayed = self.tree.item(self.tree.selection())['values'][1]
current_goals = self.tree.item(self.tree.selection())['values'][2]
current_assists = self.tree.item(self.tree.selection())['values'][3]
current_cleansheets = self.tree.item(self.tree.selection())['values'][4]
self.edit_controller = Toplevel()
self.edit_controller.title('Edit Player Record')
Label(self.edit_controller, text = 'Current Name:').grid(row=0, column=1)
Entry(self.edit_controller, textvariable = StringVar(self.edit_controller, value=name), state='readonly').grid(row=0, column=2)
Label(self.edit_controller, text = 'New Name:').grid(row=1, column=1)
new_name = Entry(self.edit_controller)
new_name.grid(row=1, column=2)
Label(self.edit_controller, text = 'Current Position:').grid(row=2, column=1)
Entry(self.edit_controller, textvariable = StringVar(self.edit_controller, value=current_position), state='readonly').grid(row=2, column=2)
Label(self.edit_controller, text = 'New Position:').grid(row=3, column=1)
new_position = Entry(self.edit_controller)
new_position.grid(row=3, column=2)
Label(self.edit_controller, text = 'Current Games Played:').grid(row=4, column=1)
Entry(self.edit_controller, textvariable = StringVar(self.edit_controller, value=current_gamesplayed), state='readonly').grid(row=4, column=2)
Label(self.edit_controller, text = 'New Games Played:').grid(row=5, column=1)
new_gamesplayed = Entry(self.edit_controller)
new_gamesplayed.grid(row=5, column=2)
Label(self.edit_controller, text = 'Current Goals:').grid(row=0, column=3)
Entry(self.edit_controller, textvariable = StringVar(self.edit_controller, value=current_goals), state='readonly').grid(row=0, column=4)
Label(self.edit_controller, text = 'New Goals:').grid(row=1, column=3)
new_goals = Entry(self.edit_controller)
new_goals.grid(row=1, column=4)
Label(self.edit_controller, text = 'Current Assists:').grid(row=2, column=3)
Entry(self.edit_controller, textvariable = StringVar(self.edit_controller, value=current_assists), state='readonly').grid(row=2, column=4)
Label(self.edit_controller, text = 'New Assists:').grid(row=3, column=3)
new_assists = Entry(self.edit_controller)
new_assists.grid(row=3, column=4)
Label(self.edit_controller, text = 'Current Clean Sheets:').grid(row=4, column=3)
Entry(self.edit_controller, textvariable = StringVar(self.edit_controller, value=current_cleansheets), state='readonly').grid(row=4, column=4)
Label(self.edit_controller, text = 'New Clean Sheets:').grid(row=5, column=3)
new_cleansheets = Entry(self.edit_controller)
new_cleansheets.grid(row=5, column=4)
Button(self.edit_controller, text='Save Changes', command = lambda: self.edit_records(new_name.get(), name, new_position.get(), current_position, new_gamesplayed.get(), current_gamesplayed, new_goals.get(), current_goals, new_assists.get(), current_assists, new_cleansheets.get(), current_cleansheets)).grid(row=6, column=4, sticky=E)
self.edit_controller.mainloop()
def edit_records(self, new_name, name, new_position, current_position, new_gamesplayed, current_gamesplayed, new_goals, current_goals, new_assists, current_assists, new_cleansheets, current_cleansheets):
query = 'UPDATE Year11 SET name = ?, position = ?, games_played = ?, goals = ?, assists = ?, clean_sheets = ? WHERE name = ?, position = ?, games played = ?, goals = ?, assists = ?, clean sheets = ?'
parameters = (new_name, name, new_position, current_position, new_gamesplayed, current_gamesplayed, new_goals, current_goals, new_assists, current_assists, new_cleansheets, current_cleansheets)
self.run_query(query, parameters)
self.edit_controller.destroy()
self.message['text'] = 'Record {} changed.'.format(name)
self.viewing_records()
我对这整个情况缺乏经验,所以任何帮助都将不胜感激!
编辑:
run_query(self, query, parameters=()):
with sqlite3.connect(self.db_name) as conn:
cursor = conn.cursor()
query_result = cursor.execute(query, parameters)
conn.commit()
return query_result
【问题讨论】:
-
@BryanOakley 这是更精致的问题。
-
显然
run_query函数创建的SQL语句有错误。但它不包含在您在问题中提供的代码中。我想说,再看看UPDATE语句的语法,让run_query打印出它生成的语句并将其与所需的语法进行比较。 -
嗨@BillBell,run_query 的代码现在在上面的原始代码部分。想不通怎么回事!定义
-
请向我们展示导致错误的确切查询。如果您删除了所有不相关的代码,这也会很有帮助。你需要创建一个minimal reproducible example
-
我同意@BryanOakley。当然,您应该自己执行
run_query以找出问题所在。
标签: python database sqlite tkinter treeview