新答案
更直接地适合您的数据集。您需要一个字典列表,而不是列表字典,因为每个字典都将列名作为键以及与该列关联的值(键)。
names = [{'name': "Freddy"}, {'name': "Joan"}]
results = c.executemany("INSERT INTO names ('name') VALUES (:name)", names)
SQLite3 代码的其余部分工作,输出:
Freddy
Joan
使用元组列表的选项
您还可以使用元组列表。如果您不使用字典,则需要make sure each row is in tuple form。您需要列表中的每个元组。您需要在 SQL 查询之后的 executemany 函数中调用此列表。
基本代码:
names = [("Freddy",), ("Joan",)]
results = c.executemany("INSERT INTO names (name) VALUES (?)", names)
输出:
Freddy
Joan
所以请确保每个条目都是元组或字典形式。然后将这些元组或字典放入一个列表中。如果它是字典形式,则不能使用“?”占位符。对每个占位符使用 ':key_name'。 (这里可能有不同的选项,但我还没有找到)。
原始回复
我怀疑 executemany(...) 应该是 execute(...)。我有一段时间没有使用 SQLite3,所以我现在对其进行测试以确保然后再回复您。
更新 1:
我记得“?”需要以元组形式发送。 IE。
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,因为它将每个字母作为元组中的值读取。如果它是元组形式,它会一口气读完“Freddy”。但是我仍然对 executemany() 有问题,我认为它的工作方式与我们认为的不同。
更新 2:
这就是我要做的工作。你需要make sure each row is in tuple form。您需要列表中的每个元组。您需要在 SQL 查询之后的 executemany 函数中调用此列表。
基本代码:
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
(灵感来自this answer。)