Python将字典插入sqlite3

Posted

技术标签:

【中文标题】Python将字典插入sqlite3【英文标题】:Python insert Dict into sqlite3 【发布时间】:2022-01-21 16:33:10 【问题描述】:

我有一个 sqlite3 数据库,其中第一列是 id 并设置为具有自动增量的主键。我正在尝试从我的 python 字典中插入值:

value = 'host': [], 'drive': [], 'percent': []
soup = bs(contents, 'html.parser')
for name in soup.find_all("td", class_="qqp0_c0"):
    hostname = name.parent.find('td').get_text()
    drive = name.parent.find('td', class_="qqp0_c1").get_text()
    used_percent = name.parent.find('td', class_="qqp0_c5").get_text()
    value['host'].append(hostname)
    value['drive'].append(drive)
    value['percent'].append(used_percent)
    #cur.executemany("INSERT INTO scrap VALUES (?, ?, ?)", hostname, drive, used_percent)
    cur.execute("INSERT INTO scrap VALUES (?, ?, ?);", value)

我不断收到错误,我最近的错误似乎暗示它需要一个id 值:

cur.execute("INSERT INTO scrap VALUES (?, ?, ?);", value) sqlite3.OperationalError: table scrap 有 4 列,但提供了 3 个值

我需要提供id 号码吗?

这是数据库架构:

CREATE TABLE scrap (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    hostname VARCHAR(255),
    drive VARCHAR(255),
    perc VARCHAR(255)
       );   

【问题讨论】:

什么是CREATE 语句,用于创建您尝试将INSERT 放入的表?如果传递 4 个值会发生什么?如果该列正确设置为自动增量,您应该可以只传递 3 个值。 不知道该怎么做 【参考方案1】:

如果id 列是自动递增的,您不需要为其提供值,但您需要“告诉”数据库您没有插入它。请注意,为了绑定字典,您需要按名称指定占位符:

cur.execute("INSERT INTO scrap (hostname, drive, perc) VALUES (:host, :drive, :percent);", value)

编辑: 跟进 cmets 的讨论 - value 字典应将占位符名称映射到它们的预期值,而不是包含它们的列表:

soup = bs(contents, 'html.parser')
for name in soup.find_all("td", class_="qqp0_c0"):
    hostname = name.parent.find('td').get_text()
    drive = name.parent.find('td', class_="qqp0_c1").get_text()
    used_percent = name.parent.find('td', class_="qqp0_c5").get_text()
    value = 'host': hostname, 'drive': drive, 'percent': used_percent  
    cur.execute("INSERT INTO scrap (hostname, drive, perc) VALUES (:host, :drive, :percent);", value)

【讨论】:

这是这样运行它的错误输出: cur.execute("INSERT INTO scrap (hostname, drive, perc) VALUES (?, ?, ?);", value) sqlite3.ProgrammingError : 绑定 1 没有名称,但您提供了一个字典(只有名称)。 这是我的数据库架构:CREATE TABLE scrap (id INTEGER PRIMARY KEY AUTOINCREMENT, hostname VARCHAR(255), drive VARCHAR(255), perc VARCHAR(255)); @codereber 我错过了修复占位符名称。请参阅我编辑的答案。 这是修复占位符名称后的错误:cur.execute("INSERT INTO scrap (hostname, drive, perc) VALUES (:hostname, :drive, :used_percent);", value) sqlite3 .ProgrammingError:您没有为绑定 1 提供值。 @codereber 抱歉,您字典中的关键字是“percent”,而不是“used_percent”——我的错。再次编辑和修复。

以上是关于Python将字典插入sqlite3的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 python 将字典值插入到 html 模板文件中?

如何使用 Python 将嵌套字典/json 插入 MySQL 表

如何使用 executemany 将 Python 中的字典列表插入 MySQL

将带有数字键的数据插入 mongodb 时出错(python 字典中的 GPS 数据)

无法使用 Python 字典作为列值执行 SQL 插入命令

如何将返回的python JSON字典转换为字典中的列表,并将数据转换为SQL插入