将python列表插入SQLite3列

时间:2018-06-22 08:51:06

标签: python list sqlite sql-insert

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

OperationalError:没有此类列:天

这是我的代码:

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都是字符串列表。有人知道我在做什么错吗?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您必须在?中使用VALUES()占位符,然后将实际值提供给execute方法。 大致上应该可以完成这项工作:

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

答案 1 :(得分: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接口通常需要 sequence ,其中zip返回一个 iterator ,所以更可移植的方式(任何数据库引擎)将是:

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