Python循环运行正常 执行SQLite插入语句后仅执行一次就停止
问题根因
- 核心为SQLite游标资源冲突:你复用同一个数据库游标
cur执行了两次操作,第一次执行SELECT查询top50表数据后,直接对游标返回的流式结果集做遍历。当循环内调用同一个cur执行INSERT语句时,SQLite会自动清空该游标上未读取完的上一次查询结果集,导致第一次插入完成后,循环找不到下一条待遍历数据,直接终止运行。
你观察到的「注释SQL插入逻辑循环就能跑完所有数据」的现象,刚好对应这个原因:没有插入操作时,游标不会被新的SQL语句占用,结果集就能完整遍历。
修复方案
必改项
将SELECT查询的结果一次性全部读取到内存列表中,再进行遍历,修改对应代码段即可:
# 原代码 # fh = cur.execute('''SELECT id, title, year FROM top50''') # rty = list() # for row in fh: # 修改后代码 rows = cur.execute('''SELECT id, title, year FROM top50''').fetchall() rty = list() for row in rows:
可选优化项
- 调整提交逻辑:可以将
conn.commit()移到整个循环结束后执行,所有数据插入完成后一次性提交,能大幅提升执行效率;如果担心中途异常丢失数据,也可以设置每插入5-10条提交一次。 - 增加异常捕获:给插入操作加异常捕获逻辑,避免单条数据字段缺失、格式异常导致整个程序终止,示例如下:
try: cur.execute('''INSERT INTO Omdbdump (title, year, rated, released, runtime, genre, director, writer, actors, plotlong, language, country, awards, poster, imdbrating, rtrating, mcrating, imdbid, type, dvd, boxoffice, production, website) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )''', (title, year, rated, released, runtime, genre, director, writer, actors, plotlong, language, country, awards, poster, imdbrating, rtrating, mcrating, imdbid, type, dvd, boxoffice, production, website)) except Exception as e: print(f"插入《{title}》数据失败,错误信息:{e}") continue
内容的提问来源于stack exchange,提问作者Louis
相关产品推荐
相关产品推荐

