当前位置:  开发笔记 > 编程语言 > 正文

SQLite参数替换问题

如何解决《SQLite参数替换问题》经验,为你挑选了3个好方法。

使用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个绑定.我该如何解决?



1> ddaa..:

Cursor.execute()方法期望序列作为第二参数.您提供的字符串恰好是8个字符长.

请改用以下表格:

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

Python库参考:sqlite3 Cursor Objects.



2> 小智..:

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

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

只是发现表名不能参数化.希望这会帮助其他人节省一些时间.


对于用户输入确定表的情况,我从dict中提取表的名称,如果输入的内容是意外的,则引发异常.可能不是_best_方式,但似乎不太可能导致SQL注入.

3> jgtumusiime..:

其中的参数cursor.execute表示您需要在数据库中插入的值应该是元组(序列).但是请考虑这个例子,看看发生了什么:

>>> ('jason')
'jason'

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

第一个示例改为求值为字符串; 所以表示单值元组的正确方法与第二次评估一样.无论如何,下面的代码来修复你的错误.

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

同时将cursor.execute值参数作为字符串给出(这就是你正在做的事情)会导致示例中的第一次评估,并导致你得到的错误.


我认为这应该是公认的答案
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有