Python相当于mysql_real_escape_string,用于将字符串安全地导入MySQL?

AP2*_*257 17 python mysql

是否有Python的Python等价物mysql_real_escape_string

我试图直接从Python插入一些MySQL数据库的字符串,并继续被字符串中的引号绊倒.

mysql_string = "INSERT INTO candidate (name, address) VALUES  " 
for k, v in v_dict.iteritems():
    mysql_string += " ('" + v_dict['name'] + "', '" + v_dict['address'] + "'), "
mysql_string += ";"
cursor.execute(mysql_string)
Run Code Online (Sandbox Code Playgroud)

我已经尝试了re.escape()但是它逃脱了字符串中的每个非字母数字字符,这不是我需要的东西 - 我只需要在这个实例中转义单引号(加上一般其他任何可能使MySQL绊倒的东西).

我想可以手动执行此操作,但是在Python中有更聪明的方法吗?

YOU*_*YOU 39

如果您使用的是mysql-python,请尝试

MySQLdb.escape_string(SQL)
Run Code Online (Sandbox Code Playgroud)

>>> import MySQLdb
>>> MySQLdb.escape_string("'")
"\\'"
Run Code Online (Sandbox Code Playgroud)

  • 您可以查看[MySQLdb的文档](http://mysql-python.sourceforge.net/MySQLdb.html#id5).它完全相当于`mysql_real_escape_string`.我知道,*我的答案并没有涵盖所有,但没有错.但好吧,你可以**不同意**. (10认同)
  • -1这是从几种方式上得出的错误答案。如果OP是从csv文件开始的,则最好使用cursor.executemany()或使用批量加载工具。 (2认同)

Ale*_*lli 14

cursor.executemany('INSERT INTO candidate (name, address) VALUES (%s, %s)',
                   [(v_dict['name'], v_dict['address'])] * len(v_dict))
Run Code Online (Sandbox Code Playgroud)

应该做你的代码似乎尝试的东西 - 插入相同的相同值N次(你循环v_dict.iteritems()但完全忽略循环变量,并且instad只是重复使用v_dict每次特定的两个值).当然,如果你的意思完全不同,第二行将需要相应地改变,但关键的想法无论如何是使用占位符,而不是字符串格式,用于这样的任务.


bob*_*nce 8

是否有Python的等效PHP的mysql_real_escape_string?

是的,它escape_string在数据库连接对象上.

escape_stringMySQLdb模块,这相当于mysql_escape_string在PHP中,与多字节字符集相同的潜在漏洞.你不应该使用MySQLdb.escape_string.

无论如何,使用参数化查询比在Alex的答案中更好.这使得更容易移植到其他数据库(它是DB-API标准的一部分,而escape_string不是),并且通常更方便.(比参数化更方便的是在PHP中.)