新答案
以更直接地适应您的数据集。您需要一个字典列表,而不是一个列表字典,因为每个字典都将列名作为键,并有一个与该列(键)关联的值。
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)
输出:
弗莱迪
琼
因此,确保每个条目都是元组或字典形式的。然后把这些元组或字典放入一个列表中。如果是字典形式,就不能使用“?”占位符。为每个占位符使用“:key_name”。(这里可能有不同的选择,但我还没有找到)。
原始回复
我怀疑executemany(…)应该是execute(…)。我已经有一段时间没有使用过sqlite3了,所以我现在将测试它以确定是否使用,然后再联系您。
更新1:
我记得“?”S“需要以元组形式发送。即。
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:
这是我要做的。你需要
确保每一行都是元组形式
. 你需要一个列表中的每个元组。在sql查询之后,需要在executemany函数中调用此列表。
基本代码:
姓名=[(“Freddy”,),(“Joan”,)]
results=c.executemany(“插入名称(名称)值(?)”名称)
完整代码:
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])
打印出来:
弗莱迪
琼
更新3:
我已经更新了它以更直接地适应您的数据集。您需要一个字典列表,而不是一个列表字典,因为每个字典都将列名作为键,并有一个与该列(键)关联的值。
这里还有一些代码,我已经开始工作了。
名字=[{name':“freddy”},{name':“joan”}]
results=c.executemany(“插入名称('name')值(:name)”,名称)
其余代码原样输出:
弗莱迪
琼
(灵感来自
this answer
)