Python3与SQLite3环境下Django项目报'django_migrations已存在'错误
问题核心分析
我之前处理过不少跨Python版本+Django大版本升级的SQLite兼容问题,你遇到的这个报错本质是:Python2与Python3对SQLite的字符串/时间序列化逻辑差异,叠加Django1.7到1.11迁移系统的逻辑更新,导致旧环境生成的django_migrations表结构或记录,在新环境下被判定为“非法”,进而触发重复创建表的冲突。
分步排查与解决
第一步:先确认
django_migrations表的合法性
用SQLite命令行打开你的数据库文件,检查表结构是否符合Django1.11的规范:sqlite3 your_project_db.sqlite3执行SQL查看表结构:
PRAGMA table_info(django_migrations);正常的Django1.11迁移表应该包含
id(整数主键)、app(字符串)、name(字符串)、applied(时间戳类型,SQLite中实际存储为TEXT)这四个字段。如果是从Python2/Django1.7继承的旧表,大概率applied字段的时间格式或存储逻辑和新环境不兼容。第二步:备份后修复迁移表
先备份好数据库文件,然后执行以下操作重置迁移表:-- 在SQLite命令行中执行 DROP TABLE django_migrations; .exit回到项目目录,用
--fake-initial参数让Django重新生成合规的迁移表,并标记所有初始迁移为已应用:python manage.py migrate --fake-initial这个参数的作用是跳过实际创建表的操作,只同步迁移状态,完美解决“表已存在”的冲突。
第三步:清理异常迁移记录
如果错误只在特定场景触发,可能是旧环境留下的迁移记录有编码或重复问题。可以先查看现有记录:SELECT * FROM django_migrations;要是发现
name字段有乱码、重复的迁移条目,直接删除这些异常记录,再执行python manage.py migrate --fake同步状态即可。第四步:检查SQLite驱动版本
Python3自带的sqlite3模块和Python2版本有底层差异,如果你的系统自带版本过旧,可能导致表结构读写不一致。可以安装更新的第三方驱动:pip install pysqlite3-binary
特定场景的额外提示
如果错误仅在特定场景出现,还要排查:
- 是否存在多环境混用Python版本执行迁移的情况,导致迁移表状态混乱
- 数据库文件是否通过版本控制同步过,导致本地与线上的迁移表状态不一致
内容的提问来源于stack exchange,提问作者alexdlaird

