【问题标题】:Insert python list into SQLite3 column将 python 列表插入 SQLite3 列
【发布时间】:2018-06-22 17:25:21
【问题描述】:

我有三个 python 列表,每个列表大约有 150 万个条目,我想将它们插入到一个新的 SQLite 表中。执行此操作时出现错误:

OperationalError: no such column: days

这是我的代码:

con = sqlite3.connect('database.db')
cur = con.cursor()
...
cur.execute("DROP TABLE IF EXISTS days")
cur.execute("CREATE TABLE IF NOT EXISTS days(DAYS_NEEDED integer, RAISED_TIME text, POSTED_TIME text)")
cur.execute("INSERT INTO days (DAYS_NEEDED, RAISED_TIME, POSTED_TIME) VALUES (days, rt_list, pt_list)")
con.commit()

"days" 是整数列表,rt_list 和 pt_list 都是字符串列表。有谁知道我在这里做错了什么?

非常感谢任何帮助!

【问题讨论】:

  • 你的列表是字符串,这样不行,你必须使用VALUES (?, ?, ?)
  • @meow 你是这个意思吗? cur.execute("INSERT INTO days (DAYS_NEEDED, RAISED_TIME, POSTED_TIME) VALUES (?,?,?)", (days, rt_list, pt_list))
  • 是的,像这样,但我认为它需要一个元组列表而不是一个列表元组(尽管我从未尝试过,所以请告诉我这是否也有效)。请参阅我的答案以获取更详细的版本,应该可以直接使用。

标签: python list sqlite sql-insert


【解决方案1】:

这不是在 SQL 中插入值列表的方式。首先,您必须使用? 作为占位符提供有效的SQL 指令。然后,如果您想一次插入多行,则需要executemany 方法。这是一个真正的改进,因为 SQL 只解析和准备一次。

所以你应该写:

cur.execute("DROP TABLE IF EXISTS days")
cur.execute("CREATE TABLE IF NOT EXISTS days(DAYS_NEEDED integer, RAISED_TIME text, POSTED_TIME text)")
cur.executemany("INSERT INTO days (DAYS_NEEDED, RAISED_TIME, POSTED_TIME) VALUES (?,?,?)",
                zip(days, rt_list, pt_list))
con.commit()

顺便说一句,zip 的直接用法是 Sqlite3 模块扩展,DB-API 2.0 Python 接口通常需要一个序列,其中zip 返回一个迭代器 ,因此更便携的方式(任何数据库引擎)将是:

cur.executemany("INSERT INTO days (DAYS_NEEDED, RAISED_TIME, POSTED_TIME) VALUES (?,?,?)",
                tuple(zip(days, rt_list, pt_list)))

【讨论】:

    【解决方案2】:

    您必须在VALUES() 中使用? 占位符,然后将实际值提供给执行方法。 类似的东西应该可以完成这项工作:

    con = sqlite3.connect('database.db')
    cur = con.cursor()
    ...
    cur.execute("DROP TABLE IF EXISTS days")
    cur.execute("CREATE TABLE IF NOT EXISTS days(DAYS_NEEDED integer, RAISED_TIME text, POSTED_TIME text)")
    
    def insert(days_needed, rt, pt):
        cur.execute("INSERT INTO days (DAYS_NEEDED, RAISED_TIME, POSTED_TIME) VALUES (?, ?, ?)", (days_needed, rt, pt))
    
    for d, rt, pt in zip(days, rt_list, pt_list):
        insert(d, rt, pt)
    
    con.commit()
    

    【讨论】:

      猜你喜欢
      • 2019-01-30
      • 2016-09-20
      • 1970-01-01
      • 2021-06-05
      • 2017-07-11
      • 1970-01-01
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多