Я не могу заставить исполняемый файл 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 Solutions collect form web for “Я не могу заставить исполняемый файл Python для работы sqlite3 работать должным образом”

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

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

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

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

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

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

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

     res = [("John", "2j4o1h2n"), ("Paula", "lsohvoeemsy"), ("Ben", "l8ers")] cur.executemany("INSERT INTO users (user, password) VALUES (?)", res) 

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

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

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

     
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.