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


185
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值。

我已经待了好几个小时,无法弄清楚到底发生了什么。

Answers:


378

您需要传递一个序列,但是您忘记了使参数成为元组的逗号:

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])

37
我们有很多犯过此错误的高级编码人员,因此无需感到愚蠢。:)
MrGumble

6
这也咬了我。如果“高级编码器”被这个愚弄了,那就意味着它是不直观的。恕我直言,如果只有一个,则execute()取一个值而不是一个单值元组会更自然。在查询中。无论如何,谢谢您的提示!
Laryx Decidua

5
@ user465139:%运算符str具有这种魔力-将元组视为多个值,但将一个str(或任何其他类型的可迭代)视为一个值。但这引起混乱的频率远远大于解决混乱的速度,这就是为什么stdlib中几乎没有其他尝试这种魔术的原因。
2014年

%s出于安全考虑,也不建议使用-docs.python.org/3/library/sqlite3.html
wesinat0r

2
cursor.execute(sql,array)

只需要两个参数。
它将迭代“数组”对象并匹配吗?在sql字符串中。
(进行健全性检查以避免sql-injection)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.