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
相关产品推荐
相关产品推荐

