web-dev-qa-db-ja.com

Python LIKEでのワイルドカードを使用したSQLiteパラメータの置換

以下のように、PythonのSqliteライブラリでパラメーター化されたLIKEクエリを使用しようとしています。

self.cursor.execute("select string from stringtable where string like '%?%' and type = ?", (searchstr,type))

しかし ?ワイルドカードの内側は評価されておらず、次のエラーが発生します。

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

タグ付きバージョンのクエリを使用することも試みました:

like '%:searchstr%'および{"searchstr":searchstr...を含むリスト

しかし、それを実行すると、クエリは実行されますが、手動で"like '%a%'"...を入力しても、何百もの結果が返されても、結果は返されません

何か提案してください?

37
atcuno

引用符はどちらかを保護します?または:nameプレースホルダーとして解釈されないため-文字通りに解釈されます。渡す文字列をパーセント記号で囲み、引用符なしのプレーンプレースホルダーを使用する必要があります。つまり:

self.cursor.execute(
  "select string from stringtable where string like ? and type = ?",
  ('%'+searchstr+'%', type))

?は引用符で囲まれています。これは、プレースホルダーとして使用する場合とまったく同じです。

72
Alex Martelli