2013-06-12 72 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')