如何在不丢失MySQL数据的前提下为Docker部署的Django应用新增模型
解决Docker中Django新增Model后表未创建的问题
以下是在不丢失MySQL原有数据的前提下,解决model_C对应表未创建的步骤:
1. 排查迁移状态
首先确认迁移文件是否生成、迁移操作是否真正应用到数据库:
检查迁移文件是否存在:
进入容器查看model_C所在应用的migrations目录,替换your_app为实际应用名:docker exec app ls your_app/migrations如果没有model_C对应的迁移文件(如
0003_model_c.py),说明makemigrations未正确生成迁移,需重新执行指定应用的迁移生成命令:docker exec app python manage.py makemigrations your_app检查数据库迁移记录:
查看MySQL中django_migrations表,确认对应迁移是否已被标记为应用,替换db_user、db_password、your_app为实际值:docker exec db mysql -udb_user -pdb_password race_record -e "SELECT * FROM django_migrations WHERE app='your_app';"如果结果中没有model_C对应的迁移记录,说明
migrate操作未生效。
2. 重新执行迁移
情况A:迁移文件存在但未应用到数据库
先将当前迁移状态标记为同步到最后一个成功应用的版本(替换last_valid_migration为已存在的最后一个迁移文件名,如0002_model_b),再重新执行迁移:
docker exec app python manage.py migrate your_app last_valid_migration --fake docker exec app python manage.py migrate your_app
情况B:迁移文件已生成且迁移记录存在,但表仍未创建
这种情况可能是迁移执行时出现隐性错误,可尝试强制重新应用该迁移:
docker exec app python manage.py migrate your_app 0003_model_c --fake-initial
(替换0003_model_c为model_C对应的迁移文件名)
3. 手动生成并执行SQL(万不得已时)
如果上述方法无效,可通过Django生成建表SQL,手动在数据库中执行:
- 生成model_C的建表SQL:
docker exec app python manage.py sqlmigrate your_app 0003_model_c > model_c.sql
- 将SQL导入到MySQL数据库:
docker exec -i db mysql -udb_user -pdb_password race_record < model_c.sql
- 在
django_migrations表中添加迁移记录,避免后续迁移冲突:
docker exec db mysql -udb_user -pdb_password race_record -e "INSERT INTO django_migrations (app, name, applied) VALUES ('your_app', '0003_model_c', NOW());"
4. 验证配置正确性
最后确认Django容器的数据库配置是否正确,确保settings.py中的DATABASES配置指向的是Docker Compose中的db服务,而非本地或其他数据库。
内容的提问来源于stack exchange,提问作者Genzo Ito
相关产品推荐
相关产品推荐

