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

Django执行manage.py migrate触发UNIQUE约束错误,寻求技术支持

解决Django迁移时sqlite3.IntegrityError: UNIQUE constraint failed: new__network_follower.user_id问题

问题根源

你之前给模型字段添加unique属性时,Django生成了对应的迁移文件并可能已部分执行,导致数据库中new__network_follower表的user_id字段被加上了唯一约束。后续你恢复模型代码但未正确清理迁移记录或数据库约束,执行migrate时,现有重复的user_id数据触发了唯一约束校验,导致报错。

解决步骤

1. 检查迁移状态与历史

  • 执行命令查看当前迁移情况:
    python manage.py showmigrations network
    
    找到最近涉及unique约束修改的迁移文件,确认它是否已被应用。

2. 回退迁移并清理无效迁移文件

  • 如果该迁移已执行,先回退到上一个正常的迁移版本(替换<previous_migration_number>为实际编号,比如0003):
    python manage.py migrate network <previous_migration_number>
    
  • 进入项目中network/migrations文件夹,删除那个添加/移除unique约束的错误迁移文件。

3. 清理数据库中的残留唯一约束

由于SQLite对修改表结构的支持有限,直接删除约束需要手动操作:

  1. 打开项目的db.sqlite3数据库文件(可用SQLite Studio等工具)。
  2. 执行以下SQL语句重建表(去掉user_id的唯一约束):
    -- 重命名原表为临时表
    ALTER TABLE new__network_follower RENAME TO temp_follower;
    
    -- 创建新表,复制原表结构但移除user_id的UNIQUE约束
    CREATE TABLE new__network_follower (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        user_id INTEGER NOT NULL,
        follower_id INTEGER NOT NULL,
        FOREIGN KEY(user_id) REFERENCES auth_user(id),
        FOREIGN KEY(follower_id) REFERENCES auth_user(id)
    );
    
    -- 将临时表的数据迁移到新表
    INSERT INTO new__network_follower SELECT * FROM temp_follower;
    
    -- 删除临时表
    DROP TABLE temp_follower;
    

4. 处理重复数据(可选但必要)

如果数据库中user_id存在重复记录,即使恢复约束也可能后续出问题,先清理重复项:

-- 查看重复的user_id
SELECT user_id, COUNT(*) FROM new__network_follower GROUP BY user_id HAVING COUNT(*) > 1;

-- 删除重复记录,保留每个user_id对应的最小id记录
DELETE FROM new__network_follower WHERE id NOT IN (
    SELECT MIN(id) FROM new__network_follower GROUP BY user_id
);

5. 重新生成并执行迁移

  • 生成正确的迁移文件:
    python manage.py makemigrations network
    
  • 执行迁移:
    python manage.py migrate network
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:35:28