从Windows迁移至Linux(Postgres环境)后makemigrations执行失败
解决Django从Windows迁移到RHEL6.8后makemigrations失败的问题
这种情况我迁移项目时也碰到过,结合你全新数据库无需保留旧数据的场景,给你几个针对性的排查和解决步骤:
1. 先确认数据库连接配置是否正确
首先要保证Django能正常连接到RHEL上的Postgres数据库:
- 打开项目的
settings.py,检查DATABASES配置块,确保NAME(数据库名)、USER(数据库用户)、PASSWORD、HOST(本地连接可设为localhost或留空)都和你在RHEL上创建的数据库信息完全匹配。 - 用Postgres命令行测试连接:执行
psql -U <你的数据库用户名> <数据库名>,如果能正常进入数据库,说明连接参数没问题;同时要确保这个用户有创建表的权限,可执行GRANT ALL PRIVILEGES ON DATABASE <数据库名> TO <用户名>;赋予权限。
2. 清理旧迁移记录(关键步骤)
从Windows带过来的旧迁移文件,和全新数据库的状态完全不匹配,这大概率是报错的核心原因:
- 进入每个app的
migrations文件夹,删除除了__init__.py之外的所有.py文件(别删__init__.py,否则Django会识别不到这个app的迁移模块)。 - 登录Postgres数据库,执行
DROP TABLE IF EXISTS django_migrations;,删除可能残留的迁移历史表(新库本来是空的,放心执行)。
3. 重新生成并执行迁移
完成清理后,重新初始化迁移流程:
- 执行
python manage.py makemigrations,这会根据当前项目的models生成全新的初始迁移文件。 - 接着执行
python manage.py migrate,这会在新数据库中创建所有需要的表,包括Django自带的系统表(比如auth_user、django_migrations等)。
4. 排查是否有提前访问数据库的代码
有些自定义代码会在迁移完成前尝试访问数据库表,导致触发"表不存在"的错误:
- 检查
apps.py中的ready()方法,有没有在项目启动时就执行查询数据库的逻辑,如果有,暂时注释掉,等迁移完成后再恢复。 - 检查是否使用了
post_migrate或其他信号量,这些信号可能在迁移过程中触发并尝试访问未创建的表,同样可以先注释,迁移后再启用。
5. 确认Python和Django版本一致性
要保证RHEL上的Python和Django版本与Windows环境一致:
- 执行
python --version和pip show django查看当前版本,如果版本差异较大,可能会导致迁移语法或兼容性问题,建议安装和Windows环境完全相同的版本。
内容的提问来源于stack exchange,提问作者user8615607
相关产品推荐
相关产品推荐

