You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQLite3与Python中查询后循环插入出现数据库锁定错误的疑问

解决SQLite database is locked 错误的方案

错误根源分析

  1. SELECT操作无需commit:你在查询记录后执行的conn.commit()完全多余,这会导致连接状态异常,反而增加锁冲突概率。
  2. 频繁提交INSERT:循环里每次插入都调用conn.commit(),会让数据库长时间持有写锁,容易引发锁竞争。
  3. 资源未及时释放:操作完成后没有关闭游标和连接,可能导致连接残留占用锁资源。

修正后的代码

conn = sqlite3.connect('serps.db')
c = conn.cursor()

# 查询记录是否存在,SELECT操作不需要commit
c.execute("SELECT fecha FROM registros WHERE fecha=? AND keyword=?", (fecha, q))
exists = c.fetchone()

if not exists:
    for data in json:
        # 这里省略你的数据处理逻辑
        c.execute("INSERT INTO registros VALUES (?, ?, ?, ?, ?, ?)", (fecha, hora, q, rank, url, title))
    
    # 所有插入操作完成后一次性提交,减少锁占用时间
    conn.commit()

# 操作结束后释放资源
c.close()
conn.close()

关于你的疑问:不需要关闭重连

完全没必要在SELECT后关闭再重新打开连接——保持同一个连接反而能减少锁的问题。关键是要避免不必要的commit操作,减少提交频次,并且确保操作完成后及时释放连接资源。

额外注意事项

  • 确认没有其他进程/线程同时操作这个数据库文件,SQLite的写锁是独占式的,多写场景下容易冲突。
  • 如果是多线程环境,每个线程要使用独立的数据库连接,不要共享连接对象。
  • 可以给连接添加超时参数,比如sqlite3.connect('serps.db', timeout=10),让连接等待锁释放的时间延长,降低锁冲突概率。

内容的提问来源于stack exchange,提问作者Pete Maverick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:40:34