SQLite でのパラメータ置換の問題のトラブルシューティング
Python を使用して SQLite3 でパラメータ置換を利用するときに問題が発生しましたか?ここでは詳細な調査と解決策を示します。
SQL インジェクションを防止するために、「?」を使用したパラメータ置換が行われます。がおすすめです。ただし、このアプローチを使用するとエラーが発生する可能性があります。たとえば、次のコードの場合:
<code class="python">for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item) self.cursor.close()</code>
エラー「sqlite3.ProgrammingError: Incorrect number of bindings provided」が発生します。これは、ステートメントで 1 つのバインディングが指定されているのに、8 つのバインディングが指定されていることを示します。この問題は、データベース テーブルの最初の作成に起因します。データベースの作成を担当するモジュールには 8 つのバインディングが含まれているため、不一致が生じます。
<code class="python">cursor.execute("""CREATE TABLE Equipment (id INTEGER PRIMARY KEY, name TEXT, price INTEGER, weight REAL, info TEXT, ammo_cap INTEGER, availability_west TEXT, availability_east TEXT)""")</code>
皮肉なことに、'?' を置き換えます。安全性の低い '%s' を使用すると、問題が解決されます:
<code class="python">for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item) self.cursor.close()</code>
この矛盾の背後にある理由は、Cursor.execute() が 2 番目のパラメータを受け入れる方法にあります。単一の文字列ではなくシーケンスが必要ですが、長さ 8 の文字列を渡しています。
この問題を修正するには、コードを次のように調整します。
<code class="python">self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])</code>
この変更パラメーターの置換が意図したとおりに機能することを保証します。 Cursor.execute() に渡される 2 番目のパラメーターが SQL ステートメント内の指定されたバインディング数に対応していることを常に確認してください。
以上がSQLite でシーケンスと文字列を使用する場合のパラメーター置換の問題を解決するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。