的問題是,你的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