Django提示SQLite数据库已锁定但实际未锁定的问题求助
兄弟,我太懂你遇到的这个糟心问题了!之前在本地测Django+SQLite的项目时,频繁操作后突然弹个database is locked,连基本操作都做不了,那种崩溃感我深有体会。你试过的重命名、复制、重启都不管用,那试试下面这些针对性的办法:
检查并释放未关闭的数据库连接
Django一般会自动管理连接,但调试时的自定义操作、强行终止进程可能会导致连接残留。可以在出问题时,在视图或shell里显式关闭连接:from django.db import connection connection.close()另外,用
python manage.py shell或自定义脚本时,别直接关终端,正常退出让连接释放。调大SQLite的锁等待超时
默认情况下SQLite只等5秒获取锁,超时就报错。你可以在settings.py里把这个时间调长:DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', 'OPTIONS': { 'timeout': 30, # 改成30秒,给锁足够的释放时间 }, } }绝对避免并发写操作
SQLite天生不支持多进程并发写,如果你同时开着开发服务器、跑Celery任务、在shell里执行写操作,大概率会触发锁。测试时尽量保证同一时间只有一个写操作在跑,比如跑服务器时别同时执行migrate或批量数据导入。开启WAL模式优化并发
SQLite的WAL(Write-Ahead Logging)模式能大幅提升并发支持,Django 3.2+默认开启,但老版本得手动配置。在settings.py的数据库配置里加:'OPTIONS': { 'timeout': 30, 'journal_mode': 'wal', # 启用WAL模式 }开启后,读写操作可以同时进行,锁的概率会低很多。
排查第三方工具的干扰
本地的杀毒软件、云同步工具(比如OneDrive、坚果云)可能会悄悄锁定数据库文件,导致SQLite无法访问。可以暂时关闭这些工具,或者把db.sqlite3移出同步目录试试。重建数据库(终极方案)
如果以上都没用,你提到的“唯一可行的办法”大概率是重建数据库,这个时候可以先导出数据再重建,避免数据丢失:# 导出数据(排除权限和内容类型表,避免导入冲突) python manage.py dumpdata --exclude auth.permission --exclude contenttypes > backup.json # 删除旧数据库 rm db.sqlite3 # 重新迁移 python manage.py migrate # 导入数据 python manage.py loaddata backup.json
内容的提问来源于stack exchange,提问作者Dialess

