【问题标题】:Python Tkinter Issue with Treeview + SQLiteTreeview + SQLite 的 Python Tkinter 问题
【发布时间】: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


【解决方案1】:
UPDATE Year11 SET ... WHERE name = ?, position = ?, ...

除了 SET 子句,WHERE 子句不采用多个表达式。你必须给它一个表达式,即,你必须通过用 AND 连接较小的表达式来组成一个大表达式。

clean sheets = ?

列名是clean_sheets

【讨论】:

  • 我已经解决了这个问题,但这就是我要解决的问题,所以感谢您的验证!
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
相关资源
最近更新 更多