Python3 SQLite3数据库无法关闭,删除时遇权限错误求助
解决SQLite3数据库删除时的权限错误
问题出在你只关闭了游标,没有关闭数据库连接对象,而且代码里重复赋值connects变量,第一次创建的连接实例被覆盖后完全没机会关闭,导致数据库文件一直被Python进程占用,无法删除。
正确处理步骤
- 关闭所有游标后,必须调用每个连接对象的
close()方法 - 避免重复覆盖连接变量,确保每个创建的连接都被显式关闭
- 推荐使用上下文管理器(
with语句)自动管理连接和游标,避免手动关闭遗漏
手动关闭的修正代码
import sqlite3 import os path_to_database = "C:\\Users\\edtur\\Python_projects\\fix\\fix.db" # 创建第一个连接与游标 connects = sqlite3.connect(path_to_database, detect_types=sqlite3.PARSE_DECLTYPES) cursors = connects.cursor() # 执行第一个连接的业务代码 # ...你的代码... # 创建第二个连接与游标(如果确实需要多连接) connects_second = sqlite3.connect(path_to_database, detect_types=sqlite3.PARSE_DECLTYPES) cursors4 = connects_second.cursor() # 执行第二个连接的业务代码 # ...你的代码... # 先关闭游标 cursors.close() cursors4.close() # 关键:关闭每个创建的连接 connects.close() connects_second.close() # 现在可以安全删除数据库文件 os.remove(path_to_database)
更简洁的上下文管理器写法(推荐)
使用with语句会在代码块结束后自动关闭连接和游标,无需手动调用close():
import sqlite3 import os path_to_database = "C:\\Users\\edtur\\Python_projects\\fix\\fix.db" # 第一个连接的操作 with sqlite3.connect(path_to_database, detect_types=sqlite3.PARSE_DECLTYPES) as connects: cursors = connects.cursor() # ...你的代码... # 第二个连接的操作 with sqlite3.connect(path_to_database, detect_types=sqlite3.PARSE_DECLTYPES) as connects_second: cursors4 = connects_second.cursor() # ...你的代码... # with块结束后连接已自动关闭,直接删除文件 os.remove(path_to_database)
额外注意事项
如果仍出现权限错误,检查:
- 是否有其他未关闭的连接实例
- 确保所有事务都已提交(可在关闭前调用
connects.commit()) - 可添加
connects.execute("PRAGMA journal_mode=DELETE;")确保日志文件被清理,释放文件锁
内容的提问来源于stack exchange,提问作者Ed Turnbull
相关产品推荐
相关产品推荐

