生产环境下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
相关产品推荐
相关产品推荐

