Я не могу заставить executemany Python для sqlite3 работать правильно

Я пытался использовать 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 ответов


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

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

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

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

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

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


просто чтобы дополнить контекст: в тесно связанной ситуации я хотел вставить список Поли-кортежей в таблицу, используя executemany такие как:

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

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

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