2013-06-12 33 views
0

我的代码结合如下:用Python字符串包括转义字符

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\'') 
+0

这会失败吗?或者你想看到一个“漂亮”的印刷品? – lalo

+0

我想这只是看起来像这样,因为在交互式会话中,只需输入'abc'将会打印(repr('abc'))'。 –

+0

我不明白你在说什么......我不是在互动模式下工作。我有一个绑定的查询没有格式化,如我所愿(如上所示)+我显示cursor._executed演示如何格式化。 – AYBABTU

回答

0

的问题是,你的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(),因此您将失去跨数据库兼容性。

+0

我希望不要这样做: placeholders =','。join(['%s'] * len(parameters)) 这就是我在这里发布的原因 - 是不是有更好的解决方案? – AYBABTU

+0

@AYBABTU查看更新的答案。 – Aya

0

你不能把它作为原始字符串输入吗?

把一个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')