【问题标题】:How can I use variables in sqlite3 python commands? [duplicate]如何在 sqlite3 python 命令中使用变量? [复制]
【发布时间】:2021-08-20 09:14:35
【问题描述】:

我知道这看起来很基础,但是我能找到的任何答案都对我不起作用。

import sqlite3

conn = sqlite3.connect("mydb.db")


cursor = conn.cursor()


name = "John Doe"
cursor.execute("SELECT * FROM users WHERE username = ?", name)
items = cursor.fetchall()
print(items)


conn.close()

我正在尝试获取用户名为“John Doe”的所有用户的列表(我知道有一个),但前面的代码给出了以下错误:

Traceback (most recent call last):
  File ".\sqlitetest.py", line 10, in <module>
    cursor.execute("SELECT * FROM users WHERE username = ?", name)
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 8 supplied.

【问题讨论】:

  • 你应该传递一个 tuple 值来绑定。 "John Doe" 被解释为一个由 8 个值组成的序列(每个值都是一个单字符串)。

标签: python python-3.x sqlite


【解决方案1】:

变量应该在一个元组中传递,即使只传递了 1 个变量,即 (name,)

cursor.execute("SELECT * FROM users WHERE username = ?", (name,))

【讨论】:

  • 我明白了。我以前试过这个,但我没有添加尾随逗号。您是否碰巧知道为什么需要其中任何一个(在元组中传递变量,以及将其识别为元组所需的尾随逗号)?
  • 需要在元组中传递变量,因为该方法需要一个可迭代的(通常传递超过 1 个变量)。当您仅将 1 项放入元组时需要尾随逗号,因此可以将其视为元组。如果您不添加尾随逗号,Python 只会将其视为放在括号内的普通表达式,例如 (3 + 5) 或 (a + b)
  • 谢谢,这解释得很好。
【解决方案2】:

通常我使用 sql server 作为数据库,我传递可变数据,例如

query = f"SELECT * FROM users WHERE username='{var_name}'"

或 query = "SELECT * FROM users WHERE username='{}'".format(var_name)

【讨论】:

  • 这实际上就是我在这里所做的。
  • 虽然使用字符串格式可能有效,但它依赖于程序员记住正确引用值,并且如果与不受信任的数据一起使用,则存在 SQL 注入攻击的风险。最好使用 DB-API 连接器提供的工具。
猜你喜欢
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 2015-12-12
  • 2016-07-26
  • 2015-01-23
  • 2016-08-17
  • 2016-05-02
  • 2019-03-21
相关资源
最近更新 更多