0

我正在尝试使用 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'' 附近使用正确的语法

4

2 回答 2

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)

并验证您传递给的 SQL 查询.execute()与您要在数据库上运行的查询相同

于 2016-10-20T00:27:58.997 回答
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 注入,应该避免。

如需更多参考,请参见此处

于 2016-10-20T00:46:55.347 回答