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

Python sqlite3.ProgrammingError:提供的绑定数量不正确。当前语句使用1,提供了74个,python,sqlite,Python,Sqlite,我不明白为什么会出现错误,我尝试插入的实际字符串长度为74个字符,它是:“/gifs/epic-fail-photos-there-I-fixed-it-aww-man-the-tire-pressures-low.gif” 我尝试在插入它之前使用str(array[cnt]),但同样的问题也发生了,数据库只有一列,这是一个文本值 我已经做了好几个小时了,我不知道发生了什么。您需要按顺序传递,但您忘记了逗号以使参数成为元组: def insert(array): connection=s

我不明白为什么会出现错误,我尝试插入的实际字符串长度为74个字符,它是:“/gifs/epic-fail-photos-there-I-fixed-it-aww-man-the-tire-pressures-low.gif”

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


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

您需要按顺序传递,但您忘记了逗号以使参数成为元组:

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

cursor.execute('INSERT INTO images VALUES(?)', (img,))
如果您觉得更容易阅读,还可以使用列表文字:

>>> len(img)
74
>>> len((img,))
1
只接受两个参数。
它将迭代“数组”-对象和匹配?在sql字符串中。

(通过健全的检查来避免sql注入)

我们有很多高级程序员犯了这个错误,所以不必觉得自己很愚蠢这也咬了我一口。如果“高级程序员”被这个愚弄了,那就意味着它是不直观的。如果execute()只接受一个值,而不是只有一个值的元组,那么它会更自然吗?在查询中。无论如何,谢谢你的提示@user465139:str上的
%
运算符具有这种魔力,它将一个元组视为多个值,而将
str
(或任何其他类型的iterable)视为单个值。但这往往会引起混乱,而不是解决问题,这就是为什么stdlib中几乎没有其他任何东西尝试这种魔法。出于安全考虑,也不建议使用
%s
,按索引键读取一行时也会出现同样的问题。必须使用这种违反直觉的格式:
cursor.execute(“从OsFileName=?”的音乐中选择*,(键),)
cursor.execute('INSERT INTO images VALUES(?)', [img])
cursor.execute(sql,array)