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

AB4*_*49K 148 python sqlite

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()
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚为什么这会给我错误,我试图插入的实际字符串是74个字符长,它是:"/ gifs/epic-fail-photos-there-i-fixed-it-aww-man-the -tire-压力,low.gif"

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

我已经好几个小时了,我无法弄清楚发生了什么.

Mar*_*ers 319

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

cursor.execute('INSERT INTO images VALUES(?)', (img,))
Run Code Online (Sandbox Code Playgroud)

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

>>> len(img)
74
>>> len((img,))
1
Run Code Online (Sandbox Code Playgroud)

如果您觉得它更容易阅读,您还可以使用列表文字:

cursor.execute('INSERT INTO images VALUES(?)', [img])
Run Code Online (Sandbox Code Playgroud)

  • 我们有很多先进的程序员犯了这个错误,所以不需要感到愚蠢.:) (28认同)
  • @ user465139:`str`上的`%`运算符执行那种魔术 - 它将元组视为多个值,但将`str`(或任何其他类型的可迭代)视为单个值.但这会引起混乱,而不是解决它,这就是为什么stdlib几乎没有别的东西会尝试那种魔法. (5认同)
  • 这也是我的意思.如果"高级程序员"被这个愚弄,那就意味着它不直观.恕我直言,如果只有一个,execute()采用单个值而不是单值元组会更自然吗?在查询中.无论如何,谢谢你的暗示! (4认同)