运行Django应用出现django.db.utils.OperationalError不支持的文件格式错误
问题定位
首先你新增SlugField的操作确实和本次报错无关,报错分为两个独立部分:
警告说明
- 警告
base.Post.tags: (fields.W340) null has no effect on ManyToManyField不影响服务启动,只是你给多对多字段tags设置了null=True参数,多对多字段通过独立中间表存储关联关系,null参数对其无效,后续删除该参数即可。
核心错误原因
sqlite3.OperationalError: unsupported file format不属于Django bug,是你当前使用的SQLite数据库文件(默认路径为项目根目录下的db.sqlite3)无法被读取,常见触发原因:
- 数据库文件被异常修改:比如用文本编辑器打开误存、跨版本迁移SQLite文件(高版本生成的数据库文件无法被低版本SQLite引擎读取)
- 项目运行时强制中断,导致数据库文件写入不完整损坏
- 数据库文件被其他进程锁定占用,读取失败
修复方案
无需保留历史数据(推荐测试环境使用)
直接删除项目根目录下的db.sqlite3文件,再删除所有app的migrations目录中除__init__.py之外的所有文件,依次执行以下命令:
python3 manage.py makemigrations python3 manage.py migrate
执行完成后重新启动服务即可。
需要保留历史数据
先备份原db.sqlite3文件,再使用SQLite自带工具修复:
- 先查看当前SQLite版本,执行
sqlite3 --version,如果版本过低先升级SQLite到生成数据库文件对应的版本 - 执行修复命令:
# 导出有效数据 sqlite3 db.sqlite3 .recover > temp.sql # 备份原损坏文件 mv db.sqlite3 db.sqlite3.bak # 重建正常数据库文件 sqlite3 db.sqlite3 < temp.sql
修复完成后重新启动服务即可。
内容的提问来源于stack exchange,提问作者Cyebukayire
相关产品推荐
相关产品推荐

