2011-12-07 1 views
3

現在、Python 2.7のSQLite 3データベースAPIを使用しています。私は、このようなのようなクエリを実行するために行くとき:? Pythonを介したSQLiteクエリで見られない

c.execute('''select ? from music where ? like "%?%"''', (attr, attr, query)) 

を私は次のエラーを取得する:

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 2, and there are 3 supplied. 

私は%?%がそれを投げているものだと思います。

答えて

3

パラメータ置換を誤解しています。 ?を、SQLステートメント内の1つの変数全体の値として使用できます。列名や表名の代わりに使用することはできません。部分の大きな文字列値として使用することはできません。あなたがこれを行うことができ、この場合には

c.execute('SELECT colname FROM music WHERE other_colname LIKE ?', ('%' + query + '%')) 

を使用すると、列名にサブにしたい場合は、文字列フォーマットを使用して、それを行う必要があります。そうし、その値がユーザー入力から来た場合、SQLインジェクションを避けるように注意する必要があります。置換されたパラメータは保護されますが、文字列の書式は保護されません。

+0

ありがとうございました。 –

+0

問題ありません。データベースのエンティティ名を置き換えることができないのは残念ですが、エンジンは利用可能な情報がなくてもクエリを準備してあらかじめコンパイルすることができません。 –

関連する問題