Вопрос-Ответ

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 74 supplied

sqlite3.ProgrammingError: предоставлено неверное количество привязок. Текущая инструкция использует 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()

Когда я пытаюсь insert("/gifs/epic-fail-photos-there-i-fixed-it-aww-man-the-tire-pressures-low.gif"), я получаю сообщение об ошибке, как в заголовке (длина строки действительно 74 символа).

Что не так с кодом и как мне это исправить?


Та же проблема возникает с MySQLdb и многими другими популярными библиотеками SQL. Смотрите Почему я получаю "TypeError: не все аргументы преобразованы при форматировании строки" при попытке использовать строку в параметризованном SQL-запросе? подробнее.

Переведено автоматически
Ответ 1

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

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])
Ответ 2

У меня эта проблема возникла, когда количество столбцов не совпадает с количеством вставляемых значений.

Например:

    conn = sqlite3.connect(',ySQL.db') 
c = conn.cursor()

sql = "INSERT INTO mytable (X1, X2, X3) VALUES (?,?,?)"

project = (Y1, Y2)

print(project)
c.execute(sql, project)
conn.commit()
conn.close()

Это вызовет ошибку, потому что число X (X1, X2, X3) не совпадает с числом Y (Y1, Y2). Таким образом, ваши столбцы должны иметь тот же номер, что и вставленные значения.

Ответ 3

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

Вы могли бы исправить это с помощью zip: cursor.execute('INSERT INTO images VALUES(?)', zip(img)).

Чтобы избежать нескольких execute-вызовов, вы можете сохранить строки в списке и обновить таблицу одним вызовом с помощью 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 в строки

python