我在列表中有一组数据,嵌入字典中,如下所示:
{“列表1”:“Freddy”、“36”、“fred”、“123 F”、“2017/04/25”、“list1 2”:“Tara”、“25”、“mtara”、“123 t”、“2018/03/22”}
参考符号:
{ key1:名称、年龄、昵称、用户标识、account_created_date、
..key2:name,年龄,昵称,用户标识,account_created_date }
所有数据都被插入到Python函数中的变量中,每个变量都有一个,如前所述。当我调用这个函数时,我会立即得到输出,如
输出:
弗雷迪
塔拉
但是,当我试图将数据插入sqlite数据库时,输出方式如下:
输出:
F
R
E
D
D
是
T
一个
R
一个
代码:
conn = sqlite3.connect(dbPath)
cur = conn.cursor()
results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", name)
conn.commit()
请你在这个问题上提供帮助。非常感谢你的帮助。谢谢。
发布于 2019-03-06 22:30:10
新答案
以更直接地适应您的数据集。您需要一个字典列表,而不是列表字典,因为每个字典都有作为键的列名和与该列(键)关联的值。
names = [{'name': "Freddy"}, {'name': "Joan"}]
results = c.executemany("INSERT INTO names ('name') VALUES (:name)", names)
其余的SQLite3代码正常工作,这将输出:
Freddy
Joan
选项来使用元组的列表
您还可以使用元组列表。如果你不使用字典,你需要确保每一行都是元组形式。。每个元组都需要在一个列表中。您需要在SQL查询之后在executemany函数中调用此列表。
基本守则:
names = [("Freddy",), ("Joan",)]
results = c.executemany("INSERT INTO names (name) VALUES (?)", names)
输出:
Freddy
Joan
因此,请确保每个条目都是元组或字典形式。然后把这些元组或字典放到一个列表中。如果它是字典形式的,则不能使用“?”占位符。对每个占位符使用“:key_name”。(这里可能有不同的选择,但我还没有找到)。
原始响应
我怀疑执行者(.)应该执行(.)。我已经有一段时间没有使用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,因为它以元组的形式读取每个字母。如果它是元组形式,它将读“弗雷迪”全部在一次。但是,我仍然对executemany()有问题,我认为它的工作方式与我们所认为的不同。
更新2:
这是我要做的。你需要确保每一行都是元组形式。。每个元组都需要在一个列表中。您需要在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
(灵感来源于这个答案。)
发布于 2019-03-06 22:34:10
你可能会考虑改变
results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", name)
至
results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", (name))
由于预期的参数是元组,所以字符串不是作为一个整体来考虑的,而是被拆分的。
https://stackoverflow.com/questions/55035355
复制