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

187
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-aww-man-the -tire-давление-low.gif»

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

Я занимаюсь этим часами и не могу понять, что происходит.

AB49K
источник

Ответы:

381

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

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])
Мартейн Питерс
источник
37
Мы много продвинутых программистов, которые допустили эту ошибку, поэтому не нужно чувствовать себя глупо. :)
MrGumble
6
Это тоже меня укусило. Если «продвинутые кодеры» обманывают это, это означает, что это не интуитивно понятно. ИМХО, было бы более естественно, если execute () принял бы одно значение вместо однозначного кортежа, если есть только один? в запросе. В любом случае, спасибо за подсказку!
Ларикс Децидуа
5
@ user465139: %Оператор on strвыполняет такую ​​магию - он рассматривает кортеж как множественные значения, но str(или любой другой тип итерации) как одно значение. Но это вызывает путаницу гораздо чаще, чем решает ее, поэтому почти ничего другого в stdlib не пытается подобного рода магии.
abarnert
использование %sтакже не рекомендуется из соображений безопасности - docs.python.org/3/library/sqlite3.html
wesinat0r
2
cursor.execute(sql,array)

Только принимает два аргумента.
Он будет повторять «массив» -объект и совпадать? в sql-строке.
(с проверкой работоспособности, чтобы избежать sql-инъекций)

Punnerud
источник