Python用sqlite3将CSV转数据库时遇TypeError与ValueError求助
Python sqlite3 导入CSV到数据库的错误修复
错误原因分析
TypeError: executemany()仅接受2个参数
executemany()的正确用法是cursor.executemany(sql语句, 参数序列),你传入了3个参数(语句、show_id、genre),不符合函数签名。而且单条genre插入用execute()更合适,也可以批量收集所有genre后再用executemany()提升效率。ValueError: 参数类型不支持
db.execute(stmnt1, (title,))返回的是游标对象,并非插入记录的ID。要获取刚插入的show_id,需使用cursor.lastrowid属性。额外隐性问题:
- SQLite中自增字段的正确写法是
INTEGER PRIMARY KEY AUTOINCREMENT(AUTOINCREMENT无空格),原代码的AUTO INCREMENT会触发语法错误。 open("favorites8.db", "w")会直接清空数据库文件,导致之前创建的表丢失,这行代码完全多余,必须删除。
- SQLite中自增字段的正确写法是
修正后的完整代码
import sqlite3 import csv # 创建数据库连接 conn = sqlite3.connect("favorites8.db") db = conn.cursor() # 创建表(修正自增字段语法,添加IF NOT EXISTS避免重复创建报错) db.execute("CREATE TABLE IF NOT EXISTS shows (id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL)") db.execute("CREATE TABLE IF NOT EXISTS genres (shows_id INTEGER, genre TEXT NOT NULL, FOREIGN KEY (shows_id) REFERENCES shows(id))") # 读取CSV文件并插入数据 with open("favorites.csv", "r") as file: reader = csv.DictReader(file) for row in reader: # 标准化标题格式 title = row["title"].strip().upper() # 插入shows表并获取ID stmnt1 = "INSERT INTO shows (title) VALUES(?)" db.execute(stmnt1, (title,)) show_id = db.lastrowid # 获取刚插入的记录ID # 方式1:单条插入genre for genre in row["genres"].split(", "): stmnt2 = "INSERT INTO genres (shows_id, genre) VALUES(?, ?)" db.execute(stmnt2, (show_id, genre)) # 方式2:批量插入genre(大文件推荐用,效率更高) # stmnt2 = "INSERT INTO genres (shows_id, genre) VALUES(?, ?)" # genre_params = [(show_id, genre) for genre in row["genres"].split(", ")] # db.executemany(stmnt2, genre_params) # 提交更改并关闭连接 conn.commit() conn.close()
关键修正点说明
- 替换错误的show_id获取方式,改用
lastrowid拿到插入记录的主键ID。 - 调整
executemany()的使用方式,要么单条用execute(),要么批量构造参数序列后调用。 - 修正SQLite自增字段的语法错误,添加
IF NOT EXISTS避免重复创建表报错。 - 删除清空数据库的
open()语句,保留sqlite3连接自动创建文件的逻辑。
内容的提问来源于stack exchange,提问作者AbuAminu
相关产品推荐
相关产品推荐

