使用SQLite3和Python 2.5,我试图遍历列表并根据项目的名称从数据库中提取项目的权重.
我试过用"?" 建议参数替换以防止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个绑定.我该如何解决?
该Cursor.execute()
方法期望序列作为第二参数.您提供的字符串恰好是8个字符长.
请改用以下表格:
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])
Python库参考:sqlite3 Cursor Objects.
我花了半天的时间试图找出为什么这样的东西会给我一个错误:
cursor.execute("SELECT * from ? WHERE name = ?", (table_name, name))
只是发现表名不能参数化.希望这会帮助其他人节省一些时间.
其中的参数cursor.execute
表示您需要在数据库中插入的值应该是元组(序列).但是请考虑这个例子,看看发生了什么:
>>> ('jason') 'jason' >>> ('jason',) ('jason',)
第一个示例改为求值为字符串; 所以表示单值元组的正确方法与第二次评估一样.无论如何,下面的代码来修复你的错误.
self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item,))
同时将cursor.execute
值参数作为字符串给出(这就是你正在做的事情)会导致示例中的第一次评估,并导致你得到的错误.