社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

sqlite3-python调用变量的问题

Mike • 5 年前 • 1675 次点击  

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

{'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
 
1675 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Jack Wu
Reply   •   1 楼
Jack Wu    6 年前

你可以考虑改变

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

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

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

Aaron Bell
Reply   •   2 楼
Aaron Bell    6 年前

新答案

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

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 )