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

新建SQLite库执行migrate报错:无法创建django_migrations表(数据库已锁定)

解决Django + Apache2部署时SQLite数据库锁定问题

这是SQLite在多进程环境下的典型故障——Apache默认会启动多个worker进程处理请求,而SQLite的文件级锁机制根本扛不住这种多进程并发访问,哪怕你删了旧数据库和迁移文件,残留的锁进程、权限问题还是会导致报错。下面一步步帮你搞定:

第一步:彻底清除所有持有锁的进程

首先必须停掉Apache,不然它的worker进程可能还攥着数据库文件的锁:

sudo systemctl stop apache2

然后检查Django项目目录里有没有SQLite的临时锁文件db.sqlite3-journal,如果存在直接删除。再用命令排查有没有其他进程在访问数据库:

lsof | grep db.sqlite3

如果输出里关联了进程,用kill <进程ID>杀掉它们。

第二步:修复文件权限(核心解决点)

Apache是以www-data用户身份运行的,这个用户必须拥有Django项目目录和数据库存放目录的读写权限。执行以下命令:

# 将项目目录的所有权转移给www-data用户组
sudo chown -R www-data:www-data /path/to/your/django/project
# 设置安全的目录权限(保证可读写但避免过度开放)
sudo chmod -R 755 /path/to/your/django/project

别用777权限,既不安全也没必要。

第三步:用正确用户重新初始化数据库

你已经删除了迁移文件,先重新生成模型迁移(如果有自定义模型的话):

python manage.py makemigrations

关键:必须用www-data用户执行migrate,不然生成的数据库文件会是当前用户权限,Apache访问不了又会触发锁问题:

sudo -u www-data python manage.py migrate

长期预生产建议:替换SQLite

哪怕预生产流量不大,SQLite也不是合适的选择——它的锁机制天生不支持多进程并发场景。建议换成PostgreSQL或MySQL,这类客户端-服务器架构的数据库能完美适配Apache的多worker模式,后续上线生产也不用再折腾换库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:51:58