問題は、 yourがエスケープしようとする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')
...これはあなたが本当に望んでいるものだと思います。
アップデート
私は次のようなことをしたくないと思っていました: placeholders = ','.join(['%s'] * len(parameters)) これが私がここに投稿した理由です - より良い解決策はありませんか?
まあ、これが「より良い」かどうかはわかりませんが、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')
...しかし、 PEP249Connection.escape_string()では言及されていないため、クロス DB の互換性が失われます。