sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用 1,提供了 74 个

Posted

技术标签:

【中文标题】sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用 1,提供了 74 个【英文标题】:sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 74 supplied 【发布时间】:2013-05-27 05:41:48 【问题描述】:
def insert(array):
    connection=sqlite3.connect('images.db')
    cursor=connection.cursor()
    cnt=0
    while cnt != len(array):
            img = array[cnt]
            print(array[cnt])
            cursor.execute('INSERT INTO images VALUES(?)', (img))
            cnt+= 1
    connection.commit()
    connection.close()

我不知道为什么这给了我错误,我尝试插入的实际字符串是 74 个字符长,它是:“/gifs/epic-fail-photos-there-i-fixed-it-aww- man-the-tire-pressures-low.gif"

我在插入之前尝试过 str(array[cnt]),但同样的问题发生了,数据库只有一列,这是一个 TEXT 值。

我已经做了好几个小时了,我不知道发生了什么。

【问题讨论】:

【参考方案1】:

你需要传入一个序列,但是你忘了用逗号把你的参数变成一个元组:

cursor.execute('INSERT INTO images VALUES(?)', (img,))

没有逗号,(img) 只是一个分组表达式,而不是一个元组,因此img 字符串被视为输入序列。如果该字符串有 74 个字符长,那么 Python 会将其视为 74 个单独的绑定值,每个值长一个字符。

>>> len(img)
74
>>> len((img,))
1

如果你觉得更容易阅读,你也可以使用列表文字:

cursor.execute('INSERT INTO images VALUES(?)', [img])

【讨论】:

我们有很多高级程序员都犯了这个错误,所以没必要觉得自己很愚蠢。 :) 这也咬了我一口。如果“高级编码人员”被此愚弄,则意味着它不直观。恕我直言,如果 execute() 只有一个值而不是单值元组,那会更自然吗?在查询中。无论如何,谢谢你的提示! @user465139:str 上的 % 运算符具有这种魔力——它将一个元组视为多个值,但将一个 str(或任何其他类型的可迭代)视为单个价值。但这导致混淆的次数远多于解决问题的次数,这就是为什么 stdlib 中几乎没有其他任何东西尝试这种魔法的原因。 出于安全考虑也不建议使用%s - docs.python.org/3/library/sqlite3.html 通过索引键读取一行也会出现同样的问题。必须使用这种违反直觉的格式:cursor.execute("SELECT * FROM Music WHERE OsFileName = ?", (key,))【参考方案2】:
cursor.execute(sql,array)

只需要两个参数。 它将迭代“数组”对象并匹配?在 sql 字符串中。 (通过完整性检查以避免 sql 注入)

【讨论】:

以上是关于sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用 1,提供了 74 个的主要内容,如果未能解决你的问题,请参考以下文章

Python 3 SQLite3 - 绑定数量不正确

Python Sqlite3 executemany 中的绑定数量不正确

在数据库Python中插入列表列表