對 SQLite 中的參數替換問題進行故障排除
在 Python 中使用 SQLite3 中的參數替換時遇到問題嗎?這裡有一個深入的調查和解決方案。
為了防止SQL注入,使用'?'進行參數替換是可取的。然而,使用這種方法時可能會出現錯誤。例如,使用以下程式碼:
for item in self.inventory_names:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
self.cursor.close()
出現錯誤“sqlite3.ProgrammingError:提供的綁定數不正確”,表示該語句指定了一個綁定,而提供了八個。此問題源自於資料庫表的初始建立。負責資料庫創建的模組包含八個綁定,導致不匹配。
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() 接受第二個參數的方式。它需要一個序列,而不是單一字串,但您傳遞的是長度為 8 的字串。
要修正此問題,請將程式碼調整為以下內容:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])
此修改可確保參數替換如預期運作。始終確保傳遞給 Cursor.execute() 的第二個參數對應於 SQL 語句中指定的綁定數量。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3