排查 SQLite 中的参数替换问题
在 Python 中使用 SQLite3 中的参数替换时遇到问题?这里有一个深入的调查和解决方案。
为了防止 SQL 注入,使用“?”进行参数替换是可取的。然而,使用这种方法时可能会出现错误。例如,使用以下代码:
<code class="python">for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item) self.cursor.close()</code>
出现错误“sqlite3.ProgrammingError:提供的绑定数量不正确”,表明该语句指定了一个绑定,而提供了八个。此问题源于数据库表的初始创建。负责数据库创建的模块包含八个绑定,这会导致不匹配。
<code class="python">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)""")</code>
讽刺的是,替换为“?”使用不太安全的 '%s' 可以解决问题:
<code class="python">for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item) self.cursor.close()</code>
这个悖论背后的原因在于 Cursor.execute() 接受第二个参数的方式。它需要一个序列,而不是单个字符串,但您传递的是长度为 8 的字符串。
要纠正此问题,请将代码调整为以下内容:
<code class="python">self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])</code>
此修改确保参数替换按预期工作。始终确保传递给 Cursor.execute() 的第二个参数对应于 SQL 语句中指定的绑定数量。
以上是使用序列与字符串时如何解决 SQLite 中的参数替换问题?的详细内容。更多信息请关注PHP中文网其他相关文章!