首页  >  文章  >  后端开发  >  使用序列与字符串时如何解决 SQLite 中的参数替换问题?

使用序列与字符串时如何解决 SQLite 中的参数替换问题?

DDD
DDD原创
2024-10-19 15:28:30460浏览

How to Resolve Parameter Substitution Issues in SQLite When Using Sequences vs. Strings?

排查 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn