3

WHERE _ IN _ステートメントを適切に使用する方法を理解しようとしています

意味:

c.execute('''CREATE TABLE IF NOT EXISTS tab (
    _id integer PRIMARY KEY AUTOINCREMENT,
    obj text NOT NULL
    ) ;''')

私はこのようなことをしようとしています:

list_of_vars=['foo','bar']
statement="SELECT * FROM tab WHERE obj IN (?)"
c.execute(statement,"'"+"','".join(list_of_vars)+"'")

または、これも試しましたが、これは上記に直接評価されます

statement="SELECT * FROM tab WHERE obj IN (?)"
c.execute(statement,"'foo','bar'")

私が得ているエラーは次のとおりです。

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

これは私にエラーを与えています。このようにするとうまくいきますが、SQL インジェクション攻撃に対して脆弱であるため、これはお勧めできません。

statement="SELECT * FROM tab WHERE obj IN ("+"'"+"','".join(statement)+"'"+")
4

2 に答える 2

10

vars のリストに一致する十分なパラメータを作成する必要があります。

statement = "SELECT * FROM tab WHERE obj IN ({0})".format(', '.join(['?'] * len(list_of_vars)))
c.execute(statement, list_of_vars)

list_of_varsパラメータ値リストとして渡すことに注意してください。を使用してコンマで区切られ', '.join()た文字列を生成し、 を使用してそれをステートメントに挿入します。?.format()

変数のリストが長い場合は、一時テーブルを使用してそれらの値を保持し、バインド パラメータをJOIN含む句よりも一時テーブルに対してを使用する方が効率的です。IN

于 2013-01-09T19:59:21.657 に答える