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字符长,它是:“/gif /史诗-失败-照片-有-我固定它aww-man-轮胎压力-低。gif”

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

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


当前回答

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

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

其他回答

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

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

为了避免多次执行调用,你可以将字符串存储在一个列表中,并在一个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的“列”转换为行