我正在尝试使用python的mysql连接器更新SQL表中单个单元格中的单个值。使用以下代码,我没有得到任何错误消息,但表实际上也没有更新。我尝试更新的单元格的值有时为空,有时为NULL,有时包含字符串。这是我的代码:
query = ("UPDATE data_set SET %s = '%s' WHERE id = %s") % (column_to_change, change_to_value, row_id)
我做错了什么?
编辑:感谢您的回复。我不认为周围的代码存在任何功能问题(在SQL注入的漏洞之外,我已经修复了,在这里和其他地方),因为我已经有效地执行了具有不同查询的类似代码。这是我现在的代码:
column_to_change = "column2"
change_to_value = "james"
id = "1234"
cnx = mysql.connector.connect(user='user', password='password',
host='db.website.com',
database='database')
cursor = cnx.cursor()
query = ("UPDATE data_set SET %s = %s WHERE policy_key = %s")
cursor.execute(query, (column_to_change, change_to_value, id))
cursor.close()
cnx.close()
如果它是相关的,那么我试图插入的单元格被格式化为VARCHAR(45)。当我在单元格上运行SELECT查询时,它返回一个格式为:(u'James',)
的名称如果我设置change_to_value =“(u'James',)”,我收到以下错误消息:
mysql.connector.errors.ProgrammingError:1064(42000):您的SQL语法中有错误;查看与您的MariaDB服务器版本对应的手册,以便在第1行''column1'='(u \'James \',''WHERE id ='1234''附近使用正确的语法
答案 0 :(得分:0)
确保您遵循所有步骤:
conn = pyodbc.connect("SERVER=my.server;DATABASE=my_database;UID=my_user;PWD=my_password;",ansi=True)
cursor = conn.cursor()
query = ("UPDATE data_set SET %s = '%s' WHERE id = %s") % (column_to_change, change_to_value, row_id)
cursor.execute(query)
并验证传递给.execute()
的SQL查询与您要在数据库上运行的SQL查询相同
答案 1 :(得分:0)
根据您的Python版本,可能是字符串插值的问题。否则,您可能无法连接光标并成功执行查询。我假设您在代码中的其他位置执行查询,但在实例中您不是,这应该有效:
cursor.execute ("""
UPDATE data_set
SET %s=%s
WHERE id=%s
""", (column_to_change, change_to_value, row_id))
或者,您可以将此查询存储在变量中,分配相应的变量并在之后执行,如下所示:
query = (“UPDATE data_set SET %s=%s WHERE id=%s”)
column_to_change = [YOUR ASSIGNMENT HERE]
change_to_value = [YOUR ASSIGNMENT HERE--if this is a string, it should be formatted as such here]
row_id = [YOUR ASSIGNMENT HERE]
cursor.execute(query, (column_to_change, change_to_value, row_id))
基本字符串插值易于SQL注入,应该避免使用。
有关详情,请参阅here