Python操作SQLite3插入数据报database is locked错误如何解决
sqlite3 插入数据报 "database is locked" 修复方案
该报错和SQL语句用字符串拼接还是参数化查询写法无关,本质是SQLite的写锁被其他连接持有,新写入请求无法获取锁触发,常见触发原因和对应解决方法如下:
- 其他进程/程序占用数据库文件:比如同时打开的SQLite可视化工具(如DB Browser for SQLite)、其他运行中的Python脚本、定时任务正连接
Tadawul.db执行读写,或是之前运行出错未正常退出的脚本残留了数据库连接。关闭所有可能访问该数据库文件的程序后,重新运行脚本即可。 - 代码未正确释放写锁:SQLite执行写入操作时默认开启事务,会持有数据库写锁直到事务提交/回滚,如果代码只执行插入语句不提交事务、也不主动关闭连接,写锁会持续残留,后续所有写入操作都会触发锁报错。
推荐使用上下文管理器编写数据库操作逻辑,自动处理事务提交、回滚和连接释放,不会残留锁,正确可运行代码如下:
import sqlite3 hello = "('hello')" # with块自动管理连接生命周期 with sqlite3.connect('Tadawul.db') as conn: curs = conn.cursor() # 此前编写的参数化查询逻辑正确,无需修改 curs.execute("INSERT INTO stock_price (close) VALUES (?)", (hello, )) # 退出with块时自动提交事务、关闭连接释放锁
异常排查补充
如果关闭所有相关程序后仍报错,可进入Tadawul.db所在目录,查找Tadawul.db-journal、Tadawul.db-wal、Tadawul.db-shm这类SQLite运行时生成的临时文件,确认无程序正在操作数据库的前提下,删除这类临时文件即可清除残留锁。
注意:禁止使用字符串拼接方式构造SQL语句,该写法存在SQL注入风险,参数化查询是官方推荐的安全写法。
内容的提问来源于stack exchange,提问作者mansour32
相关产品推荐
相关产品推荐

