Python中等效于mysql_real_escape_string的安全插入MySQL字符串的方法?

21 投票
6 回答
38377 浏览
提问于 2025-04-15 21:07

有没有和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("'")
"\\'"

撰写回答