Я не могу заставить 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 ожидает отдельно подставленные атрибуты в