”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 使用序列与字符串时如何解决 SQLite 中的参数替换问题?

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

发布于2024-11-08
浏览:861

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

对 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 语句中指定的绑定数量。

版本声明 本文转载于:1729322897如有侵犯,请联系[email protected]删除
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3