我有三个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都是字符串列表。有人知道我在做什么错吗?
非常感谢您的帮助!
答案 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)))