Python MySQL 更新查询

Posted

技术标签:

【中文标题】Python MySQL 更新查询【英文标题】:Python MySQL Update Query 【发布时间】:2021-01-04 23:47:01 【问题描述】:

我正在尝试根据用户输入更新 SQL 表我有以下代码。用户可以选择输入/更改以下默认为 SQL 表中的值的字段。但是,当我运行代码时,我收到以下错误消息

mysql.connector.errors.ProgrammingError: SQL 语句的参数不足

我数了很多次,似乎 %s 与传递的参数匹配。我错过了什么吗?

user = User_name_body.get('1.0',END)
passw = Password_text.get('1.0',END)
first = First_name.get('1.0',END)
last = Last_name.get('1.0',END)
phone = Phone_number.get('1.0',END)
email = Email_address.get('1.0',END)
mycursor = mydb.cursor()

sql = "UPDATE t_users SET Email_address=%s, First_name=%s, Last_name=%s, Phone_Number=%s, Password=%s WHERE User_Name=%s VALUES(%s,%s,%s,%s,%s,%s)"
val = (email, first, last, phone, passw,user)

mycursor.execute(sql, val)
mydb.commit()
mydb.close()

【问题讨论】:

当我尝试删除 VALUES(%s,%s,%s,%s,%s,%s) 代码能够执行但数据库没有更新 【参考方案1】:

UPDATE 不带 VALUES,您应该将您的 sql 查询行更改为如下所示:

sql = "UPDATE t_users SET Email_address=%s, First_name=%s, Last_name=%s, Phone_Number=%s, Password=%s WHERE User_Name=%s"

Python 会抛出一个错误,因为您要求 12 个参数并且只提供 6 个。

【讨论】:

我删除了 VALUES(%s,%s,%s,%s,%s,%s) 并且代码运行但没有用更改更新 SQL 表。这是因为只有一个值可能不同,即只有电子邮件更改? 确保用户与数据库中的用户实际对应。另外,添加print(mycursor.rowcount, "record(s) affected") 并确保它实际上影响了一行。 由于某种原因,当我将 .get 用于 tkinter 时,它们是每个变量后的一个空格键字符,因此在删除它后它没有更新,现在查询可以工作了,谢谢您的帮助【参考方案2】:

像这样准备你的 sql 数据:

sql = """ UPDATE t_users SET Email_address=%s, First_name=%s, Last_name=%s, Phone_Number=%s, Password=%s WHERE User_Name = %s """

val = (email, first, last, phone, passw, user)

mycursor.execute(sql, val)

或者你可以这样做

sql = "UPDATE btms_users SET btms_users.user='%s', btms_users.secret='%s' , btms_users.first_name='%s', " \
                      "btms_users.second_name='%s', btms_users.email='%s', btms_users.mobile='%s' " \
                      "WHERE btms_users.id='%s'" % (user_name, user_secret, user_firstname, user_lastname,
                                                    user_email, user_phone, user_id)
    
mycursor.execute(sql)

这是一个完整的工作示例:

import mysql.connector

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="test",
  database="test"
)

mycursor = mydb.cursor()

sql = "UPDATE items SET name = %s WHERE id = %s"
val = ("Test", 1)

mycursor.execute(sql, val)

mydb.commit()

print(mycursor.rowcount, "record(s) affected")

【讨论】:

我删除了 VALUES(%s,%s,%s,%s,%s,%s) 并且代码运行但没有用更改更新 SQL 表。这是因为只有一个值可能不同,即只有电子邮件更改? 我为你添加了一个完整的工作示例,我自己尝试过。 您的第二个示例在 SQL 字符串中的所有值都被替换为 %,上面写满了“SQL 注入攻击”。第一个例子很好。 由于某种原因,当我将 .get 用于 tkinter 时,它们是每个变量后的一个空格键字符,因此在删除它后它没有更新,现在查询可以工作了,谢谢您的帮助

以上是关于Python MySQL 更新查询的主要内容,如果未能解决你的问题,请参考以下文章

使用python将mySql查询结果转换为json

如何在python中的mysql查询中使用动态变量

PYTHON 数据库mysql更新语句中加入变量?

day06-python数据库-mysql之基础

Python通过pymysql连接数据库并进行查询和更新SQL方法封装

mysql账号只能更新和新增不能查询