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

生产环境下Django Migrations无法执行迁移问题求助

Django生产环境迁移异常解决指南

问题概况

基于MySQL的Django项目,执行python manage.py makemigrations生成的迁移文件里包含旧字段删除操作,但运行python manage.py migrate时提示No migrations to apply,数据库里新增的cancellation_note和iban字段根本没加上。之前遇到类似问题用--fake参数能解决,但这次没用,而且生产环境不能删迁移文件或重置数据库。

附生成的迁移文件(仅新增两个字段,但文件里多了旧字段删除和新模型创建操作):

class Migration(migrations.Migration):

    dependencies = [
        ('auths', '0001_initial'),
    ]

    operations = [
        migrations.RemoveField(
            model_name='customuser',
            name='bank_account_iban',
        ),
        migrations.RemoveField(
            model_name='customuser',
            name='bank_account_name',
        ),
        migrations.RemoveField(
            model_name='customuser',
            name='bank_account_name_on_card',
        ),
        migrations.RemoveField(
            model_name='customuser',
            name='social_media_account',
        ),
        migrations.AddField(
            model_name='customuser',
            name='cancellation_note',
            field=models.CharField(blank=True, max_length=255),
        ),
        migrations.AddField(
            model_name='customuser',
            name='iban',
            field=models.CharField(blank=True, max_length=255),
        ),
        migrations.CreateModel(
            name='payze_saved_cards',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('CardToken', models.CharField(max_length=255, null=True)),
                ('CardMask', models.CharField(max_length=255, null=True)),
                ('CardBrand', models.CharField(max_length=255, null=True)),
                ('CardCountry', models.CharField(max_length=255, null=True)),
                ('CardHolder', models.CharField(max_length=255, null=True)),
                ('ExpirationDate', models.CharField(max_length=255, null=True)),
                ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
            ],
        ),
    ]

解决步骤

1. 核对迁移记录状态

先查auths应用的迁移记录,确认Django认为哪些迁移已经执行:

python manage.py showmigrations auths

如果新生成的迁移(比如0002_xxx)已经打勾,说明Django标记它为已应用,但实际数据库没同步。

2. 手动同步数据库与迁移记录

第一步:备份数据库

生产环境操作前必须全量备份,防止数据丢失:

mysqldump -u [你的数据库用户名] -p [数据库名] > migration_backup.sql

第二步:手动添加缺失字段

直接用SQL在数据库里补加需要的字段:

ALTER TABLE auths_customuser ADD COLUMN cancellation_note VARCHAR(255) NULL;
ALTER TABLE auths_customuser ADD COLUMN iban VARCHAR(255) NULL;

如果需要创建payze_saved_cards表,参照迁移文件里的CreateModel结构写建表SQL执行。

第三步:标记迁移为已应用

用--fake参数让Django认为该迁移已经执行,不用真的跑迁移逻辑:

python manage.py migrate --fake auths [你的迁移文件编号,比如0002_xxx]

3. 修复迁移依赖问题

当前迁移依赖的是0001_initial,如果之前有未记录的数据库变更,可能导致依赖混乱。可以修改迁移文件的dependencies为最后一个确实已应用的迁移版本,然后重新生成迁移:

dependencies = [
    ('auths', '0001_initial'),  # 确保这是最后一个正确应用的迁移版本
]

备份现有迁移文件后,重新生成:

python manage.py makemigrations auths --name fix_migration_issue

再用--fake标记旧的异常迁移为已应用,执行新生成的迁移。

4. 排查根源

  • 检查是否有人手动修改过数据库表结构,导致Django迁移记录和实际库结构不匹配。
  • 确认生产环境和开发环境的Django版本一致,版本差异可能导致迁移逻辑异常。

内容的提问来源于stack exchange,提问作者Rafaell444

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 13:47:53