的问题是,你的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')
...我以为是你真正想。
更新
我希望不要做这样的事情:占位符=”, '加盟([' %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()
,因此您将失去跨数据库兼容性。
这会失败吗?或者你想看到一个“漂亮”的印刷品? – lalo
我想这只是看起来像这样,因为在交互式会话中,只需输入'abc'将会打印(repr('abc'))'。 –
我不明白你在说什么......我不是在互动模式下工作。我有一个绑定的查询没有格式化,如我所愿(如上所示)+我显示cursor._executed演示如何格式化。 – AYBABTU