Python 2.5 で SQLite3 を使用して、リストを反復処理し、アイテムの名前に基づいてデータベースからアイテムの重量を取得しようとしています。
「?」を使ってみました。SQL インジェクションを防ぐためにパラメーター置換が提案されましたが、機能しません。たとえば、次を使用する場合:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
self.cursor.close()
エラーが発生します:
sqlite3.ProgrammingError: 提供されたバインディングの数が正しくありません。現在のステートメントは 1 を使用しており、8 個が提供されています。
これは、データベースの最初の作成が原因であると考えています。実際にDBを作成する私が作成したモジュールには、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()
1つしか呼び出していないのに、8つのバインドがあると考える理由がわかりません。どうすれば修正できますか?