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

问题描述:

这是我的查询。Python/MySQL组合的最佳转义字符策略是什么?

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

行值有双引号“some value”时失败。我如何逃避所有特殊字符?

+2

为Python + MySQL的最好的逃生策略准备查询。 – zneak 2010-08-23 16:42:19

+0

请您详细说明一下吗?谢谢! – ThinkCode 2010-08-23 16:42:56

+0

@zneak:准备1k行的扩展插入。 – Mchl 2010-08-23 16:46:16

下面是一个例子:

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

+0

你能解释一下你的方法吗?它工作出色!我不明白字典(列=列)部分.. – ThinkCode 2010-08-23 17:33:09

+0

已更新的回答。往上看。 – 2010-08-23 17:45:48

+1

列转义在这里是错误的,列是标识符并且需要''字符并加倍''如果里面有一些(在列名中),而不是引号转义。 – regilero 2013-12-10 11:08:16

对于值,您应该使用准备好的查询来嵌入它们。对于排,我不太确定...这取决于你的设置。您可能想要接受ASCII值32以上的任何字符,但不包括未转义的反引号。不过,不要认为这有一个特定的功能。

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

准备好的查询有问号里应该有变量,你在列表中通过或元组为第二个参数指定什么他们应该被取代。司机将负责保证值的安全。尽管如此,你只能在需要价值的地方放置讯问标记;所以你不能使用它们作为列名。

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

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

_mysql_exceptions.ProgrammingError:(1064,“你的SQL语法有错误;请查看与你的MySQL服务器版本相对应的手册,以找到在第一行使用':col1 WHERE ID =:id'附近的正确语法”)任何指针?谢谢.. – ThinkCode 2010-08-23 17:21:47

+0

也许这些命名参数仅适用于Oracle。尝试使用'?'位置参数来代替@zneak的答案。 – 2010-08-23 18:17:32

当你使用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)) 
+0

这看起来不像预期的那样工作:'conversion.MySQLConverter()。escape('blah; truncate other;')'=>''blah;截断其他;''。 – b4hand 2015-09-21 20:30:39