Djongo环境下manage.py migrate执行异常:尝试重复创建已存在的shareactivity表
解决Djongo迁移时重复创建已存在表的问题
嘿,我之前用Djongo做Django后端时也碰到过类似的迁移异常,你的情况是Djongo错误地尝试重新创建已经在22号迁移中完成的shareactivity表,哪怕最新的23号迁移已经依赖了22号。下面是几个经过验证的解决思路:
可能的修复方案
1. 核对迁移文件的依赖与内容
- 打开你的23号迁移文件,先检查
dependencies列表里是不是确实包含了['你的应用名', '0022_xxx'](就是创建shareactivity的那支迁移)。有时候自动生成的依赖会出问题,手动修正后,Django就会知道不需要重复执行之前的表创建操作。 - 再看文件里的
operations部分,有没有意外混入创建shareactivity表的代码?如果有,直接删掉这部分多余的操作就行。
2. 用--fake标记旧迁移为已执行
如果Django的迁移记录(数据库里的django_migrations表)没正确记录22号迁移已完成,可以手动告诉Django:
python manage.py migrate --fake 你的应用名 0022
这个命令不会真的修改数据库,只是把22号迁移标记为已执行。之后再运行python manage.py migrate,Django就会跳过22号,直接执行23号的内容。
3. 重新生成迁移文件并清理索引
Djongo处理MongoDB索引时偶尔会抽风,导致迁移逻辑混乱:
- 先删掉23号迁移文件,然后重新运行
python manage.py makemigrations,确保新生成的文件里只有NetworkIgnoreUsers相关的操作(创建模型、添加对应的索引)。 - 如果还是不行,可以手动去MongoDB里删掉
shareactivity表的旧索引(如果有冲突的话),再重新跑迁移。
4. 检查Djongo和Django的版本兼容性
有些Djongo版本和特定Django版本搭配会出现迁移逻辑错误:
- 确认你用的Djongo版本和Django版本兼容(比如Django 4.x对应Djongo 1.3.x及以上版本)。
- 如果版本不匹配,升级或降级Djongo到对应版本后再尝试迁移。
你的相关代码与错误信息
NetworkIgnoreUsers 模型代码
class NetworkIgnoreUsers(models.Model): _id = M.ObjectIdField() userId = models.CharField(max_length=50,blank=True,null=True) ignoreUserId = models.CharField(max_length=50,blank=True,null=True) mutualConnect = models.BigIntegerField(default=0) createTime = models.DateTimeField(blank=True,null=True) class Meta: indexes = [ models.Index(fields=['userId'],name='idx_network_user_id'), models.Index(fields=['ignoreUserId'],name='idx_network_ignore_user_id'), models.Index(fields=['createTime'],name='idx_post_create_time') ]
ShareActivity 模型代码
class ShareActivity(models.Model): _id = M.ObjectIdField() shareId = models.CharField(max_length=50, blank=True, null=True) userId = models.CharField(max_length=50, blank=True, null=True) activityId = models.CharField(max_length=50,blank=True, null=True) activityType = models.CharField(max_length=50, blank=True, null=True) parentId = models.CharField(max_length=50, blank=True, null=True) updateTime=models.DateTimeField(blank=True,null=True) class Meta: indexes = [ models.Index(fields=['shareId'], name='idx_shareid'), models.Index(fields=['userId'], name='idx_userid'), models.Index(fields=['activityId'], name='idx_activityid'), models.Index(fields=['activityType'], name='idx_activitytype'), models.Index(fields=['parentId'], name='idx_parentid'), models.Index(fields=['updateTime'], name='idx_updatetime'), ]
迁移错误信息
djongo.sql2mongo.SQLDecodeError: FAILED SQL: CREATE TABLE shareactivity
makemigrations 输出内容
- Create model NetworkIgnoreUsers - Add field hidden to post - Create index idx_post_hidden on field(s) hidden of model post - Create index idx_network_user_id on field(s) userId of model networkignoreusers - Create index idx_network_ignore_user_id on field(s) ignoreUserId of model networkignoreusers - Create index idx_post_create_time on field(s) createTime of model networkignoreusers
内容的提问来源于stack exchange,提问作者NoobCoder
相关产品推荐
相关产品推荐

