Новый ответ
Для более точного соответствия вашему набору данных. Вам нужен список словарей, а не словарь списков, потому что каждый словарь имеет имя столбца в качестве ключа и значение, связанное с этим столбцом (ключом).
names = [{'name': "Freddy"}, {'name': "Joan"}]
results = c.executemany("INSERT INTO names ('name') VALUES (:name)", names)
Остальная часть кода SQLite3 работает, это выводит:
Freddy
Joan
Возможность использовать список кортежей
Вы также можете использовать список кортежей. Если вы не используете словарь, вам нужно убедиться, что каждая строка имеет форму кортежа . Вам нужен каждый из этих кортежей в списке. Вы должны вызвать этот список в функции executemany после запроса SQL.
Основной код:
names = [("Freddy",), ("Joan",)]
results = c.executemany("INSERT INTO names (name) VALUES (?)", names)
Выход:
Freddy
Joan
Поэтому убедитесь, что каждая запись представлена в виде кортежа или словаря. Затем поместите эти кортежи или словари в список. Если это в форме словаря, вы не можете использовать «?» заполнитель. Используйте ': key_name' для каждого заполнителя. (Здесь может быть другой вариант, но я его еще не нашел).
Оригинальный ответ
Я подозреваю, что executemany (...) должен быть выполнен (...). Я давно не использовал SQLite3, поэтому сейчас протестирую его, чтобы убедиться, а затем вернусь к вам.
Обновление 1:
Я помню, что "?" Нужно было отправить в виде кортежа. То есть
cur.executemany("INSERT INTO Field (Field1) VALUES (?)", name)
должно быть не менее
cur.executemany("INSERT INTO Field (Field1) VALUES (?)", (name, ...))
Но я только заставил работать execute () (а не executemany ()), в противном случае он вернулся к той же ошибке. Итак, вот мой рабочий код:
cur.execute("INSERT INTO Field (Field1) VALUES (?)", (name,))
Он дал F, R, E, D, D, Y, потому что читал каждую букву как значения в кортеже. Если бы это было в форме кортежа, это прочитало бы "Фредди" все сразу. Но у меня все еще есть проблемы с executemany (), который, я думаю, работает иначе, чем мы думаем.
Обновление 2:
Вот что я получил на работу. Вам нужно убедиться, что каждая строка имеет форму кортежа . Вам нужен каждый из этих кортежей в списке. Вы должны вызвать этот список в функции executemany после запроса SQL.
Основной код:
names = [("Freddy",), ("Joan",)]
results = c.executemany("INSERT INTO names (name) VALUES (?)", names)
Полный код:
import sqlite3
conn = sqlite3.connect('test.db')
c = conn.cursor()
# Create table
c.execute('''CREATE TABLE IF NOT EXISTS names
(name text)''')
names = [("Freddy",), ("Joan",)]
results = c.executemany("INSERT INTO names (name) VALUES (?)", names)
conn.commit()
for row in c.execute('SELECT * FROM names'):
print(row[0])
Это распечатывает:
Freddy
Joan
Обновление 3:
Я обновил его, чтобы он больше подходил для вашего набора данных. Вам нужен список словарей, а не словарь списков, потому что каждый словарь имеет имя столбца в качестве ключа и значение, связанное с этим столбцом (ключом).
Вот еще немного кода, я приступил к работе.
names = [{'name': "Freddy"}, {'name': "Joan"}]
results = c.executemany("INSERT INTO names ('name') VALUES (:name)", names)
С остальным кодом, как это было, он выводит:
Freddy
Joan
(Вдохновленный этим ответом .)