sqlite3.ProgrammingError: указано неверное количество привязок. Текущий оператор использует 1, и есть 74 поставленных

81
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-all- человек-The-шин-давление-low.gif"

Я пытаюсь использовать str (array [cnt]) перед его вставкой, но та же проблема возникает, база данных содержит только один столбец, который является значением TEXT.

Я был у него часами, и я не могу понять, что происходит.

Теги:
sqlite3

1 ответ

180
Лучший ответ

Вам нужно пройти в последовательности, но вы забыли запятую, чтобы сделать ваши параметры кортежем:

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])
  • 24
    У нас много продвинутых программистов, которые допустили эту ошибку, поэтому не нужно чувствовать себя глупо. :)
  • 3
    Это тоже меня укусило. Если «продвинутые кодеры» обманывают это, это означает, что это не интуитивно понятно. ИМХО, было бы более естественно, если execute () принял бы одно значение вместо однозначного кортежа, если есть только один? в запросе. В любом случае, спасибо за подсказку!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню