問題は、 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 の互換性が失われます。