错误: 提供的绑定数不正确。当前语句使用1,提供了74个绑定

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/expic-fall-photos-there-i-fix-it-aww-man-The-ire-pressure-low.gif”

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

我已经看了好几个小时了,还是不明白到底怎么回事。

264256 次浏览

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

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

你会对这样一个事实感到困惑,即你只处理单列数据,但语法兼容一次处理几个列,因此要将字符串转换为一个,即元组。

你可以用zip: cursor.execute('INSERT INTO images VALUES(?)', zip(img))来修复它。

为了避免多次调用__abc0,你可以将字符串存储在一个列表中,并在一次调用中使用executemany更新你的表:

def insert(array):
connection = sqlite3.connect('images.db')
cursor = connection.cursor()
cnt = 0
imgs = []
while cnt != len(array):
img = array[cnt]
print(array[cnt])
imgs.append(img)
cnt += 1


cursor.executemany('INSERT INTO images VALUES(?)', zip(imgs))

executemany是面向行的,而zip将"列"imgs的行