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

Django提示SQLite数据库已锁定但实际未锁定的问题求助

解决Django + SQLite环境下的"database is locked"问题

兄弟,我太懂你遇到的这个糟心问题了!之前在本地测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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:59:06