【问题标题】:Error while displaying output - Python - SQLite显示输出时出错 - Python - SQLite
【发布时间】:2019-07-28 20:11:58
【问题描述】:

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

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

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

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

输出:
弗雷迪
度母

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

输出:
F
R
电子
D
D
是的
T
一个
R
一个

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

在此问题上请求您的帮助。非常感谢您的帮助。谢谢。

【问题讨论】:

    标签: python python-3.x python-2.7 sqlite


    【解决方案1】:

    新答案

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

    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。)

    【讨论】:

    • 谢谢亚伦,你的想法奏效了。我将整个数据放入列表中,然后将它们转换为元组。除此之外,我还必须将 sqlite 函数从 executemany 更改为执行并将其放在 for 循环中。
    【解决方案2】:

    你可能会考虑改变

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

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

    由于期望的参数是一个元组,所以字符串不被认为是一个整体,而是被分割

    【讨论】:

    • 您好,感谢您的回复。我这样做了,但是输出没有区别。我得到了同样的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多