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

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

DDD
发布: 2024-10-19 15:28:30
原创
567 人浏览过

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

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板