SQLite参数replace问题

在Python 2.5中使用SQLite3,我试图迭代一个列表,并根据项目的名称从数据库中拉取项目的权重。

我尝试使用“?” 参数replacebuild议防止SQL注入,但它不起作用。 例如,当我使用:

for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item) self.cursor.close() 

我得到的错误:

sqlite3.ProgrammingError:提供的绑定数量不正确。 当前语句使用1,并提供了8。

我相信这是由数据库的初始创build造成的。 我所做的实际创build数据库的模块确实有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”replace每个项目名称,它工作得很好。 像这样:

 for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item) self.cursor.close() 

我不知道为什么当我只打一个电话时,认为我有8个bindins。 我该如何解决?

Cursor.execute()方法期望一个序列作为第二个参数。 你正在提供一个恰好是8个字符的string。

请改用下面的表单:

 self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item]) 

Python库参考13.13.3:sqlite3 游标对象 。

我花了半天的时间试图找出为什么这样的事情会给我一个错误:

 cursor.execute("SELECT * from ? WHERE name = ?", (table_name, name)) 

只有找出表名不能被参数化 。 希望这会帮助别人节省一些时间。

表示你需要插入数据库的值的cursor.execute参数应该是一个元组(sequence)。 然而,考虑这个例子,看看发生了什么:

 >>> ('jason') 'jason' >>> ('jason',) ('jason',) 

第一个例子求值为一个string。 所以表示单值元组的正确方法与第二次评估一样。 无论如何,下面的代码来解决你的错误。

 self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item,)) 

同样以cursor.execute值作为string参数(这正是你正在做的)的结果是在这个例子中的第一个评估,并得到你得到的错误的结果。

你试过这个吗? :

 for item in self.inventory_names: t = (item,) self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", t) self.cursor.close() 

cursor.execute()期望一个序列(列表,元组)作为第二个参数。 ( – > ddaa)

引用(这是什么parens是什么意思?)? 与parens似乎为我工作。 我一直试图(字面上)“? 但我一直在得到

ProgrammingError:提供的绑定数量不正确。 当前语句使用0,并提供1。

当我做了:

SELECT事实FROM factoids WHERE键LIKE(?)

代替:

SELECT事实FROM factoids WHERE键LIKE'?'

有效。

这是一些Python 2.6的东西?

项目的每个元素必须是一个元组。 假设名字看起来像这样:

 names = ['Joe', 'Bob', 'Mary'] 

你应该做以下的事情:

 for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", (item, )) 

通过使用(item),你使它成为一个元组而不是一个string。

尝试

 execute("select fact from factoids where key like ?", "%%s%" % val) 

你不包裹什么? 毕竟,Python的sqlite会正确地将其转换为引用的实体。