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

Django迁移报错:django_site_domain_v2339b81_uniq已存在,求解决方案

解决Django迁移错误:relation "django_site_domain_v2339b81_uniq" already exists

这个问题的核心是Django的迁移状态和数据库实际结构不一致——0002_alter_domain_unique迁移想要创建的唯一约束已经存在于你的数据库中,但Django的迁移记录里还没标记这个迁移为已执行,所以执行迁移时就会触发冲突报错。

下面是一步步的可行解决办法:

1. 确认数据库中确实存在该约束

先验证你的数据库里已经有这个唯一约束了,根据你使用的数据库类型运行对应的命令:

  • PostgreSQL:
    SELECT conname FROM pg_constraint WHERE conname LIKE 'django_site_domain%';
    
  • MySQL:
    SHOW INDEX FROM django_site WHERE Key_name LIKE '%domain%';
    

如果查询结果里包含django_site_domain_v2339b81_uniq(或类似名称的唯一约束),说明数据库已经存在该约束,接下来只需要让Django的迁移状态跟上实际情况即可。

2. 标记0002_alter_domain_unique迁移为已执行

运行这条命令,告诉Django这个迁移已经在数据库中完成了(不需要真的执行迁移操作,只是更新迁移状态):

python manage.py migrate --fake sites 0002_alter_domain_unique

3. 验证迁移状态并完成后续操作

运行showmigrations确认状态:

python manage.py showmigrations sites

此时应该看到0002_alter_domain_unique旁边已经标记为[X]:

sites
[X] 0001_initial
[X] 0002_alter_domain_unique

之后再执行正常的迁移命令,应该就不会再报错了:

python manage.py migrate

问题根源说明

你之前执行的python manage.py migrate --fake sites zero会把sites app的迁移状态回滚到初始,但并没有实际修改数据库结构——而你的数据库里可能之前已经执行过0002_alter_domain_unique迁移,创建了那个唯一约束。之后的--fake-initial只标记了0001_initial为已应用,但没处理0002,导致Django认为还需要执行这个迁移,从而和已存在的约束冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:54:16