Python/MySQL组合中最佳转义字符策略是什么?

5 投票
4 回答
19307 浏览
提问于 2025-04-16 03:11

这是我的查询。

cursor2.execute("update myTable set `"+ str(row[1]) +"` = \"'" + str(row[3]) +"'\" where ID = '"+str(row[0])+"'")

当行中的值有双引号,比如"某个值"时,它就出错了。我该怎么处理所有特殊字符呢?

4 个回答

7

你应该学会使用查询参数:

colname = str(row[1]).replace("`", "\\`")
sql = "update myTable set `%s` = :col1 WHERE ID = :id" % (colname)
cursor2.execute(sql, {"col1":str(row[3]), "id":str(row[0])})
7

对于值,你应该使用预处理查询来嵌入它们。至于行,我不太确定……这要看你的设置。你可能想要接受ASCII值大于32的任何字符,但不包括未转义的反引号。不过,我觉得没有特定的函数来处理这个。

cursor2.execute("UPDATE myTable SET `" + str(row[1]) + "` = ? WHERE ID = ?", (row[3], row[1]))

预处理查询中会有问号,代表那些应该替换的变量,然后你可以把一个列表或元组作为第二个参数传入,来指定这些变量应该替换成什么。驱动程序会负责确保这些值是安全的。不过,问号只能放在需要值的地方,所以不能把它们用作列名。

13

这里有一个例子:

import MySQLdb
column = str(MySQLdb.escape_string(row[1]))
query = "update myTable set %(column)s = %%s where ID = %%s" % dict(column = column) 
cursor2.execute(query, [row[3], row[0]])

更新

这里有一个简短的评论:

column = str(MySQLdb.escape_string(row[1]))

在查询中处理任何内容时,最好先进行转义。在这个例子中,我们动态地添加了一个列名,因此在执行查询之前必须先进行转义。

query = "update myTable set %(column)s = %%s where ID = %%s" % dict(column = column) 

我在这里构建查询。我想实现两个目标:(1)使用前面声明的column变量来填充列名(2)添加占位符,这些占位符将在查询执行时被实际参数替换。

代码片段dict(column = column)其实是另一种创建字典{'column': column}的方法。这是通过使用dict构造函数实现的。我暂时不想填充其他占位符,所以我用两个百分号(%%)来转义它们。

cursor2.execute(query, [row[3], row[0]])

最后执行查询。如果在执行之前打印查询,你会看到字符串update myTable set column_name = %s where ID = %s

撰写回答