【问题标题】:Python insert Dict into sqlite3Python将字典插入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 个值。
  • 不知道该怎么做

标签: python-3.x sqlite


【解决方案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”——我的错。再次编辑和修复。
猜你喜欢
  • 1970-01-01
  • 2017-02-11
  • 2019-01-12
  • 2021-06-05
  • 1970-01-01
  • 2022-10-18
  • 2017-08-16
  • 2021-03-03
  • 2018-06-03
相关资源
最近更新 更多