Я не могу получить executemany Python для sqlite3 для правильной работы - PullRequest
14 голосов
/ 17 марта 2011

Я пытался использовать executemany для вставки значений в базу данных, но у меня это просто не работает. Вот образец:

clist = []
clist.append("abc")
clist.append("def")
clist.append("ghi")
cursor.executemany("INSERT INTO myTable(data) values (?) ", clist)

Это дает мне следующую ошибку:

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

Однако, когда я изменяю список, он работает нормально:

clist = ["a", "b"]
cursor.executemany("INSERT INTO myTable(data) values (?) ", clist)

Работает как положено! Я могу видеть данные в базе данных. Почему первый список не работает, а второй работает?

(PS: это всего лишь пример, а не реальный код. Я сделал небольшой тест для простоты)

Ответы [ 2 ]

16 голосов
/ 17 марта 2011

Из того, что я знаю о executemany, вы имели в виду,

clist = [("abc", ), ("def", ), ("ghi", )]
cursor.executemany("INSERT INTO myTable(data) values(?)", clist)

Или что-то подобное. Не указывайте мне синтаксис для sqlite, я давно не использовал его в приложении, но вам нужен итеративный набор кортежей (в общем, итерируемые).

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

clist = [('a', 'b', 'c'), ('d', 'e', 'f'), ('g', 'h', 'i')]

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

7 голосов
/ 15 марта 2013

Просто для дополнения контекста. В тесно связанной ситуации я намеревался вставить список таблиц в таблицу, используя executemany как таковое:

res = [("John", "2j4o1h2n"), ("Paula", "lsohvoeemsy"), ("Ben", "l8ers")]

cur.executemany("INSERT INTO users (user, password) VALUES (?)", res)

Ожидается, что SQLite будет принимать по одному кортежу за раз (отсюда одиночное ? подстановка параметров в поле VALUES) и разбивает его на его инкапсулированные атрибуты (<username>, <password> в этом случае) , также произошел сбой с исключением sqlite3.ProgrammingError The current statement uses 1, and there are 2 supplied., поскольку SQLite ожидает отдельно подставленных атрибутов в поле VALUES (...). Так что это исправляет:

cur.executemany("INSERT INTO users (user, password) VALUES (?, ?)", res)

Это тривиальный случай, но может немного запутать, я надеюсь, что это может помочь тому, кто застрял.

...