You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不丢失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,手动在数据库中执行:

  1. 生成model_C的建表SQL:
docker exec app python manage.py sqlmigrate your_app 0003_model_c > model_c.sql
  1. 将SQL导入到MySQL数据库:
docker exec -i db mysql -udb_user -pdb_password race_record < model_c.sql
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 08:13:18