SQLite でのパラメーター置換の問題のトラブルシューティング
SQLite3 で Python でパラメーター置換を利用するときに問題が発生しましたか?詳細な調査と解決策は次のとおりです。
SQL インジェクションを防止するために、「?」を使用したパラメータ置換が行われています。がおすすめです。ただし、このアプローチを使用するとエラーが発生する可能性があります。たとえば、次のコードの場合:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
self.cursor.close()
エラー「sqlite3.ProgrammingError: Incorrect number of bindings provided」が発生します。これは、ステートメントで 1 つのバインディングが指定されているのに、8 つのバインディングが指定されていることを示します。この問題は、データベース テーブルの最初の作成に起因します。データベース作成を担当するモジュールには 8 つのバインディングが含まれているため、不一致が発生します。
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)""")
皮肉なことに、'?' を置き換えます。安全性の低い「%s」を使用すると問題が解決されます:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item)
self.cursor.close()
この矛盾の背後にある理由は、Cursor.execute() が 2 番目のパラメーターを受け入れる方法にあります。単一の文字列ではなくシーケンスが必要ですが、長さ 8 の文字列を渡しています。
この問題を修正するには、コードを次のように調整します:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])
この変更により、パラメーターの置換が意図したとおりに機能することが保証されます。 Cursor.execute() に渡される 2 番目のパラメータが SQL ステートメント内の指定されたバインディング数に対応していることを常に確認してください。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3