我在列表中有一组数据,嵌入到字典中的方式如下:
{'list1':['Freddy','36','fred','123f','2017/04/25'], 'list2':['Tara','25','mtara','123t','2018/03/22']}
引用符号:
{key1:[姓名,年龄,昵称,用户ID,account_created_date],
..key2:[姓名,年龄,昵称,用户ID,account_created_date]}
所有数据均插入Python函数的变量中,每个变量一个,如上所述。当我调用该函数时,我会立即获得
的输出 输出:
弗雷迪
塔拉
但是当我尝试将数据插入sqlite数据库时,我会以以下方式获得输出:
输出:
F
R
E
D
D
Y
T
A
R
A
代码:
conn = sqlite3.connect(dbPath)
cur = conn.cursor()
results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", name)
conn.commit()
请求您提供有关此问题的帮助。非常感谢您的帮助。谢谢。
答案 0 :(得分:2)
更直接地适合您的数据集。您需要字典列表,而不是列表字典,因为每个字典都将列名作为键以及与该列(键)关联的值。
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了,所以我现在对其进行测试以确保再次得到您的反馈。
我记得需要以元组形式发送“?”。即
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()有问题,我认为它的工作方式与我们认为的不同。
这就是我要工作的地方。您需要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
我已经对其进行了更新,以更直接地适合您的数据集。您需要字典列表,而不是列表字典,因为每个字典都将列名作为键以及与该列(键)关联的值。
还有更多代码,我已经开始工作了。
names = [{'name': "Freddy"}, {'name': "Joan"}]
results = c.executemany("INSERT INTO names ('name') VALUES (:name)", names)
其余代码保持原样,它输出:
Freddy
Joan
(灵感自this answer。)
答案 1 :(得分:1)
您可能会考虑更改
results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", name)
到
results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", (name))
由于期望的参数是一个元组,因此该字符串不被视为一个整体,而是被分割