这是我的疑问。
cursor2.execute("update myTable set `"+ str(row[1]) +"` = \"'" + str(row[3]) +"'\" where ID = '"+str(row[0])+"'")
当行值具有双引号“某个值”时失败。如何逃避所有特殊字符?
答案 0 :(得分: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)使用在前一行(2)中声明的column
变量填充列名称,添加占位符,这些占位符将在查询执行期间由实际参数填充。
代码段dict(column = column)
实际上是创建字典{'column': column}
的另一种方式。使用dict构造函数可以实现这一点。我不想
填写其他占位符然后我使用两个百分号(%%
)来逃避它们。
cursor2.execute(query, [row[3], row[0]])
最后执行查询。如果在执行前打印查询,则会看到字符串update myTable set column_name = %s where ID = %s
。
答案 1 :(得分:7)
对于值,您应该使用准备好的查询来嵌入它们。对于行,我不太确定......这取决于你的设置。您可能希望接受ASCII值32以上的任何字符,除非未转义的反引号。但是,不要认为这有特定的功能。
cursor2.execute("UPDATE myTable SET `" + str(row[1]) + "` = ? WHERE ID = ?", (row[3], row[1]))
准备好的查询中存在应该有变量的问号,并且您将列表或元组作为第二个参数传入,以指定它们应该替换的内容。司机将负责确保价值安全。但是,您只能将询问标记放在预期值的位置;所以你不能将它们用作列名。
答案 2 :(得分: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])})
答案 3 :(得分:2)
当您使用Oracle MySql connector时,您可以按照以下方式转义特殊字符:
import mysql.connector
from mysql.connector import conversion
query = "SELECT id, code, name, description FROM data WHERE code='{:s}'"
escaped_text = conversion.MySQLConverter().escape(unescaped_text)
cursor.execute(query.format(escaped_text))