【发布时间】:2010-09-18 17:44:19
【问题描述】:
在 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 个。
我相信这在某种程度上是由数据库的初始创建引起的;我创建的实际创建数据库的模块确实有 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()
我不明白为什么当我只调用一个时它认为我有 8 个绑定。我该如何解决?
【问题讨论】:
-
列数不是绑定数。查询中“?”的数量就是绑定的数量。
-
是的,我知道。我只是认为代码以某种方式试图使用“create table”语句引用的绑定。我没有意识到它指的是项目本身的字母数。