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

Python操作SQLite数据库提示database is locked错误求助

问题排查及修复方案

核心报错原因

你遇到的database is locked报错根本原因是sqlite3上下文管理器使用错误:

  • with sqlite3.connect("PhoneBook.db") as db 语法的作用是自动管理数据库连接生命周期:当代码执行跳出with的缩进块后,上下文会自动提交未完成的操作、关闭数据库连接。你的代码仅把创建cursor的逻辑放在with块内,后续所有建表、插入数据的操作都在with块外执行,此时连接已经被自动关闭,残留的连接进程会占用数据库文件锁,再次操作就会触发锁报错。
  • 额外的冗余操作:使用with上下文管理连接时,不需要手动调用db.close(),重复执行关闭操作也可能引发异常。
  • 小规范问题:你的表结构中ID字段定义为integer整数类型,插入时传入字符串格式的数值虽然会被sqlite3隐式转换,但建议统一传整数避免潜在问题。

修正后的代码

import sqlite3
# 所有数据库操作都放到with的缩进块内
with sqlite3.connect("PhoneBook.db") as db:
    cursor = db.cursor()
    
    cursor.execute("""CREATE TABLE IF NOT EXISTS Names(
            ID integer PRIMARY KEY, firstname text NOT NULL, surname text NOT NULL,
            phonenumber text);""")
    
    # 插入数据,ID传整数更符合字段定义
    cursor.execute("""INSERT INTO Names (ID,firstname,surname,phonenumber)VALUES 
                   (6,"Simon","Howels","01223349752")""")
    cursor.execute("""INSERT INTO Names (ID,firstname,surname,phonenumber)VALUES 
                   (7,"Karen","Philip","0954295773")""")
    cursor.execute("""INSERT INTO Names (ID,firstname,surname,phonenumber)VALUES 
                   (8,"Darren","Smith","01583749012")""")
    cursor.execute("""INSERT INTO Names (ID,firstname,surname,phonenumber)VALUES 
                   (9,"Anne","Jones","01323567322")""")
    cursor.execute("""INSERT INTO Names (ID,firstname,surname,phonenumber)VALUES 
                   (10,"Mark","Smith","01223855534")""")
# 跳出with块后自动提交+关闭连接,不需要手动commit和close

额外说明

如果修改代码后还是报锁错误,直接删除同级目录下的PhoneBook.db文件重新运行即可,是之前错误运行残留的锁占用了文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:48:05