Python中等效于mysql_real_escape_string的安全插入MySQL字符串的方法?
有没有和PHP的 mysql_real_escape_string
相似的Python方法?
我想直接从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)
我试过 re.escape()
,但这个方法会把字符串里所有非字母数字的字符都转义,这样不太符合我的需求——我只想转义单引号(还有其他可能会让MySQL出错的字符)。
我想我可以手动处理这些,但有没有更聪明的方法在Python里做到这一点呢?
6 个回答
8
有没有和PHP的mysql_real_escape_string功能相同的Python方法?
有的,Python中可以用数据库连接对象上的escape_string
。
注意,不是在MySQLdb
模块上的escape_string
,这个在功能上相当于PHP的mysql_escape_string
,但在处理多字节字符集时也有潜在的安全隐患。所以你不应该使用MySQLdb.escape_string
。
总的来说,使用参数化查询会更好,就像Alex的回答中提到的那样。这种方式更容易迁移到其他数据库(因为它是DB-API标准的一部分,而escape_string
不是),而且通常也更方便。(比起PHP中的参数化查询,这种方式方便得多。)
15
cursor.executemany('INSERT INTO candidate (name, address) VALUES (%s, %s)',
[(v_dict['name'], v_dict['address'])] * len(v_dict))
你的代码看起来是想做的事情是——把相同的值插入N次(你在循环遍历v_dict.iteritems()
,但完全忽略了循环变量,而是每次都重复使用v_dict
中的那两个特定值)。当然,如果你的意思完全不同,第二行就需要相应地修改,但无论如何,关键的想法是,对于这样的任务,应该使用占位符,而不是字符串格式化。
42
如果你在使用mysql-python这个库,试试下面的代码:
MySQLdb.escape_string(SQL)
示例代码
>>> import MySQLdb
>>> MySQLdb.escape_string("'")
"\\'"