对 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