【问题标题】:MySQL UPDATE with Python使用 Python 进行 MySQL 更新
【发布时间】:2021-12-10 00:48:36
【问题描述】:

我正在尝试从名为 Template、Table clients 的数据库中更新记录。我从 Tkinter Treeview 获取更新信息。我正在更新除 user_id 之外的任何字段,这是我的主键。我在 cur.execute(sql_command) 上收到语法错误。 cur 被定义为我的光标。

# Function to Edit Record 
def edit_client():
# Update the Database
    print(user_id_box.get())
    sql_command = ("UPDATE clients SET \
        f_name = f_name_box.get(),\
        l_name = l_name_box.get(),\
        email = email_box.get(),\
        phone = phone_box.get(),\
        price = price_box.get(),\
        address = address_box.get(),\
        city = city_box.get(),\
        state = state_box.get(),\
        country = country_box.get(),\
        zipcode = zipcode_box.get() WHERE user_id = user_id_box.get()")

   # Execute the SQL command
   cur.execute(sql_command)
   # Commit the changes to the database
   mydb.commit()
   # Clear the old entry
   clear_record()
   # Refresh the Data Frame
   query_database()

【问题讨论】:

  • 不是缩进错误?我可以看到您在sql_command 之后的每一行都忘记了一个空格。

标签: python mysql tkinter sql-update


【解决方案1】:

最简单的解决方案是使用 f-string 和大括号将值正确放入字符串中。这里我也使用了文档字符串,所以你不需要反斜杠。

def edit_client():
    print(user_id_box.get())
    sql_command = f"""UPDATE clients SET 
        f_name = {f_name_box.get()},
        l_name = {l_name_box.get()},
        email = {email_box.get()},
        phone = {phone_box.get()},
        price = {price_box.get()},
        address = {address_box.get()},
        city = {city_box.get()},
        state = {state_box.get()},
        country = {country_box.get()},
        zipcode = {zipcode_box.get()} WHERE user_id = {user_id_box.get()}"""

   cur.execute(sql_command)
   mydb.commit()
   clear_record()
   query_database()

但是 我强烈建议您清理输入并将它们作为参数传递给执行程序,因为 SQL 注入仍然存在,即使您不关心安全性,您仍然可以通过输入损坏来简单地中断查询。

我不知道您使用哪个库来与 DB 通信,但它的文档应该涵盖它,如果它不是 1970 年初由某个学生创建的。

【讨论】:

  • 除了 SQL 注入之外,如果任何字段是字符串字段,您的解决方案将不起作用。例如,如果f_name 是一个字符串字段并且f_name_box.get() 返回John,那么最终的SQL 将类似于UPDATE ... SET f_name = John, ...,这是无效的。它应该像UPDATE ... SET f_name = "John", ...。应使用占位符而不是 f-string。
【解决方案2】:

请注意,f_name.get()"f_name = f_name.get()" 之类的字符串中不起作用。

对于您的情况,您可以在 SQL 语句中使用占位符(%s for MySQL):

sql_command = f"""UPDATE clients
                  SET f_name = %s, l_name = %s,
                      email = %s, phone = %s,
                      price = %s, address = %s,
                      city = %s, state = %s,
                      country = %s, zipcode = %s
                  WHERE user_id = %s"""

cur.execute(sql_command, (f_name_box.get(), l_name_box.get(),
                          email_box.get(), phone_box.get(),
                          price_box.get(), address_box.get(),
                          city_box.get(), state_box.get(),
                          country_box.get(), zipcode_box.get(),
                          user_id_box.get()))

【讨论】:

  • 不能用WHERE user_id = %s吗?
  • @CoolCloud 打错字了,谢谢提醒。
  • 非常感谢。是的,它适用于占位符。非常感谢。
猜你喜欢
  • 1970-01-01
  • 2013-11-04
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多