Python:Mysql转义函数生成损坏的查询

Python:Mysql转义函数生成损坏的查询,python,mysql,python-3.x,Python,Mysql,Python 3.x,Python mysql默认的转义函数会破坏查询。 原始查询字符串如下。它工作正常,并根据需要向数据库添加记录 INSERT IGNORE INTO state (`name`, `search_query`, `business_status`, `business_type`, `name_type`, `link`) VALUES ("test_name1", "test", "test_status", "test_b_typ", "test_n_typ", "test_link"),

Python mysql默认的转义函数会破坏查询。 原始查询字符串如下。它工作正常,并根据需要向数据库添加记录

INSERT IGNORE INTO state (`name`, `search_query`, `business_status`, `business_type`, `name_type`, `link`) VALUES ("test_name1", "test", "test_status", "test_b_typ", "test_n_typ", "test_link"), ("test_name2", "test", "test_status", "test_b_typ", "test_n_typ", "test_link")
但是在使用函数对其进行转义以确保sql注入的安全性之后 safe\u sql=self.conn.escape\u字符串(原始\u sql) 正在生成的安全sql如下

b'INSERT IGNORE INTO state (`name`, `search_query`, `business_status`, `business_type`, `name_type`, `link`) VALUES (\\"test_name1\\", \\"test\\", \\"test_status\\", \\"test_b_typ\\", \\"test_n_typ\\", \\"test_link\\"), (\\"test_name2\\", \\"test\\", \\"test_status\\", \\"test_b_typ\\", \\"test_n_typ\\", \\"test_link\\")'
现在,如果我尝试执行safe_sql,我会得到下面的语法错误

MySQLdb._exceptions.ProgrammingError: (1064, 'You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near \'\\"test_name1\\", \\"test\\", \\"test_status\\", \\"test_b_typ\\", \\"test_n_typ\\", \\"tes\' at line 1')
这让我想知道,如果我使用的转义函数是坏的/不兼容的,还是我没有正确使用它?同时,我一次输入数百条记录,由于与运行数百次的准备语句相比,单个查询的处理速度很快(我完全假设),因此我创建了一个大型查询

您无法逃避整个查询!您不能通过随机连接字符串然后在其上挥舞魔杖并使其“注入安全”来构造查询。在将每个值放入查询之前,需要对其进行转义。例如:

"INSERT ... VALUES ('%s', ...)" % self.conn.escape_string(foo)
但实际上,您的MySQL API可能提供了准备好的语句,这些语句更易于使用,也不容易出错。比如:

self.conn.execute('INSERT ... VALUES (%s, %s, %s, ...)',
                  (foo, bar, baz))

试着用单引号(‘your_value_1’、‘value_2’)来设置值向我解释为什么不使用预先准备好的语句?只需将所有值替换为
(或
%s
,具体取决于您使用的驱动程序),并将带有值的
元组
传递给
执行
语句。看看我解释过的这个例子!因为通过循环一条准备好的语句来输入数百条记录比单个查询要慢。尽管如@deceze所解释的,在这种情况下,ExecuteMy是一种方法,正如我所提到的,如果我添加1000条记录:执行单个查询不会比执行一条准备好的语句1000次快得多吗。附近有工作吗。或者我们可以提供一个准备好的语句来运行,一次提供1000个元组吗?1)您仍然可以创建一个查询,使用准备好的语句插入多个记录。2) 你的API可能有一个方法,也可以解决这个问题。仅供参考,你可能需要阅读和执行。是的,执行很多是一种方法,就像在文档中一样,它的唯一目的是使它比在循环中执行单个预处理语句更快。这是完美的解决方案!评论不用于扩展讨论;这段对话已经结束。