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

2024-05-15 00:02:32 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的问题。

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

当行值有双引号“some value”时,它将失败。我该如何转义所有特殊字符?


Tags: idexecutevaluemytableupdatesomewhererow
3条回答

对于值,应该使用准备好的查询来嵌入它们。对于争吵,我不太确定。。。这取决于你的环境。您可能需要接受ASCII值32以上的任何字符,但非转义的反勾号除外。不过,不要认为这有特定的功能。

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

准备好的查询在应该有变量的地方有问号,您可以传入一个列表或元组作为第二个参数来指定应该用什么替换它们。司机会确保这些价值观的安全。但是,您只能在需要值的地方放置查询标记;因此不能将它们用作列名。

下面是一个例子:

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

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

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])})

相关问题 更多 >

    热门问题