我在列表中有一组数据,嵌入到字典中:
{'list1': ['Freddy','36','fred','123f','2017/04/25'], 'list2':['Tara','25','mtara','123t','2018/03/22']}
引用符号:
{ key1: [姓名, 年龄, 昵称, userid, account_created_date],
..key2:[姓名, 年龄, 昵称, userid, account_created_date] }
如上所述,所有数据都插入到 Python 函数的变量中,每个变量一个。当我调用该函数时,我会立即得到输出
输出:
弗莱迪
度母
但是当我尝试将数据插入到 sqlite 数据库中时,我得到的输出方式如下:
输出:
F
乙
D
D
是
T
一个
一个
代码:
conn = sqlite3.connect(dbPath)
cur = conn.cursor()
results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", name)
conn.commit()
在此问题上请求您的帮助。非常感谢您的帮助。谢谢。
最佳答案
新答案
更直接地适合您的数据集。您需要一个字典列表,而不是列表字典,因为每个字典都将列名作为键,并有一个与该列(键)关联的值。
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 。)
关于python - 显示输出时出错 - Python - SQLite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55035355/