AWS环境下Django执行makemigrations后migrate无生效问题求助
解决AWS EB部署Django时自动生成的迁移文件无法应用到RDS的问题
问题根源
你的项目.gitignore规则排除了products/migrations/目录下除__init__.py外的所有文件,AWS Elastic Beanstalk部署时只会同步Git仓库中存在的文件。虽然container_commands里的makemigrations能在容器内临时生成迁移文件,但后续migrate执行时,这些临时文件无法被正确识别,导致提示"No migrations to apply.",RDS数据表无变化。
解决方案
方案一:调整.gitignore规则(推荐规范做法)
- 打开项目根目录的
.gitignore文件,找到针对migrations的忽略规则,把原来的:
修改为只忽略编译后的pyc文件:products/migrations/*.py !products/migrations/__init__.pyproducts/migrations/*.pyc - 把本地已有的迁移文件(包括刚生成的Category111相关迁移)提交到Git仓库:
git add products/migrations/ git commit -m "Add migration files for Category111" git push - 重新部署到EB,此时migrate命令会直接读取Git同步过来的迁移文件,正常应用到RDS。
方案二:优化container_commands配置
如果暂时不想提交迁移文件到Git,可以调整EB配置,确保makemigrations生成的文件能被migrate正确读取:
修改.ebextensions/10_django.config中的container_commands:
container_commands: 01_makemigrations: command: "python manage.py makemigrations products --noinput --settings=config.settings.production" leader_only: true cwd: "/opt/python/current/app" 02_migrate: command: "python manage.py migrate --noinput --settings=config.settings.production" leader_only: true cwd: "/opt/python/current/app"
leader_only: true:确保只有主实例执行迁移,避免多实例同时操作数据库冲突cwd:指定命令执行的工作目录为项目根目录,确保migrate能找到刚生成的迁移文件
验证方法
- 部署完成后,查看EB实例的
cfn-init-cmd.log,确认migrate步骤输出类似"Applying products.000x_create_category111... OK" - 登录RDS PostgreSQL,执行以下SQL验证:
-- 查看迁移记录 SELECT * FROM django_migrations WHERE app = 'products'; -- 查看是否生成目标表 SELECT * FROM products_category111 LIMIT 1;
内容的提问来源于stack exchange,提问作者Newb_newb
相关产品推荐
相关产品推荐

