Py学习  »  Python

sqlite3-python调用变量的问题

Mike • 4 年前 • 784 次点击  

我在一个列表中有一组数据,嵌入到字典中,如下所示:

{'list1':['freddy','36','fred','123f','2017/04/25'], 'list2':['tara','25','mtara','123t','2018/03/22']}

参考符号:
{key1:[姓名、年龄、昵称、用户名、帐户创建日期],
..key2:[姓名、年龄、昵称、用户ID、帐户创建日期]}

所有数据都插入到python函数中的变量中,每个变量一个,如上所述。当我调用这个函数时,我会立即得到输出

输出:
弗莱迪
塔拉

但是,当我尝试将数据插入到sqlite数据库时,我将按以下方式获得输出:

输出:
F
R
e
D
D
Y
T

R

代码:
conn = sqlite3.connect(dbPath)
cur = conn.cursor()
results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", name)
conn.commit()

请求你在这个问题上的帮助。非常感谢你的帮助。谢谢您。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43207
 
784 次点击  
文章 [ 2 ]  |  最新文章 4 年前
Jack Wu
Reply   •   1 楼
Jack Wu    5 年前

你可以考虑改变

results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", name)

results = cur.executemany("INSERT INTO Field (Field1) VALUES (?)", (name))

由于预期的参数是元组,因此字符串不被视为一个整体,而是被拆分

Aaron Bell
Reply   •   2 楼
Aaron Bell    5 年前

新答案

以更直接地适应您的数据集。您需要一个字典列表,而不是一个列表字典,因为每个字典都将列名作为键,并有一个与该列(键)关联的值。

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 )