我的代码如下:
select_query = "SELECT DISTINCT name FROM people WHERE name in (%s)"
parameters = "'"+"','".join(['\','--','where'])+"'"
cursor.execute(select_query, parameters)
print str(cursor._executed)
我要执行的查询是:
SELECT DISTINCT name FROM people WHERE name in ('','--','where')
我把这个参数作为最后的手段——它仍然没有完全达到我想要的效果。Python转义字符,打印返回:
SELECT DISTINCT name FROM people WHERE name in (''\','--','where'')
问题是您的parameters
是一个字符串,其中包含MySQLdb
将试图转义的字符。
你可以自己插入查询字符串…
select_query = "SELECT DISTINCT name FROM people WHERE name in (%s)"
parameters = "'"+"','".join(['\','--','where'])+"'"
cursor.execute(select_query % parameters)
print str(cursor._executed)
…但这是脆弱的SQL注入,不会在你的情况下工作,因为它会产生…
SELECT DISTINCT name FROM people WHERE name in ('','--','where')
…从SO的语法高亮中可以看出,这不是一个有效的查询。
这样做更安全…
parameters = ['\','--','where']
placeholders = ','.join(['%s'] * len(parameters))
select_query = "SELECT DISTINCT name FROM people WHERE name in (%s)" % placeholders
cursor.execute(select_query, parameters)
print str(cursor._executed)
…这将产生一个类似于…
的查询。SELECT DISTINCT name FROM people WHERE name in ('\','--','where')
…我想这才是你真正想要的。
我希望不要这样做:占位符= ','.join(['%s'])* len(参数))这就是为什么我张贴在这里-没有更好的解决方案吗?
嗯,我不确定这是任何"更好",但您可以使用MySQLdb
特定的Connection.escape_string()
方法,或底层_mysql
模块的escape_string()
函数…
>>> import _mysql
>>> select_query = "SELECT DISTINCT name FROM people WHERE name in (%s)"
>>> parameters = "'"+"','".join(map(_mysql.escape_string, ['\','--','where']))+"'"
>>> print select_query % parameters
SELECT DISTINCT name FROM people WHERE name in ('\','--','where')
…但是在PEP249中没有提到Connection.escape_string()
,因此您将失去跨数据库兼容性。
不能直接输入一个原始字符串吗?
在字符串前面放一个r
;
print "SELECT DISTINCT name FROM people WHERE name in ('','--','where')"
SELECT DISTINCT name FROM people WHERE name in ('','--','where')
而对于r
:
print r"SELECT DISTINCT name FROM people WHERE name in ('','--','where')"
SELECT DISTINCT name FROM people WHERE name in ('','--','where')