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

使用Gorm构建用户与好友多对多关系时遇字段不存在错误

问题分析与解决方案

错误原因

你遇到的column "id" referenced in foreign key constraint does not exist错误,核心问题是模型设计逻辑错误:好友关系本质是用户与用户之间的自关联多对多,不需要单独定义Friend结构体。原代码中独立的Friend模型完全多余,导致Gorm在生成中间表时,错误地尝试引用不存在的外键关联。

修正后的代码

删除多余的Friend结构体,将Users(建议改为User,符合Go单例命名规范)修改为自关联多对多:

import (
    "time"
    "github.com/google/uuid"
    "gorm.io/gorm"
)

type User struct {
    Id           uuid.UUID `gorm:"type:uuid;default:gen_random_uuid();primaryKey" json:"id,omitempty"`
    UserName     string    `json:"user_name,omitempty" gorm:"column:user_name"`
    Password     string    `json:"password,omitempty" gorm:"column:password"`
    Email        string    `json:"email,omitempty" gorm:"unique"`
    Dob          time.Time `json:"dob,omitempty"`
    Gender       string    `json:"gender,omitempty"`
    // 自关联多对多:指定中间表名、外键和引用键
    Friends      []User    `json:"friends,omitempty" gorm:"many2many:user_friends;joinForeignKey:user_id;joinReferences:friend_id"`
    LastLoggedIn time.Time `json:"last_logged_in,omitempty"`
    CreatedAt    time.Time `json:"created_at,omitempty"`
    UpdatedAt    time.Time `json:"updated_at,omitempty"`
}

关键修正点

  1. 自关联多对多:好友是另一个User实例,用同一模型的自关联实现,无需额外的Friend模型。
  2. 明确中间表配置:
    • many2many:user_friends:指定中间表名称(比原friends更清晰,避免歧义)
    • joinForeignKey:user_id:当前用户在中间表的外键字段名
    • joinReferences:friend_id:关联的好友用户在中间表的外键字段名
  3. 模型命名规范:将Users改为User,符合Go语言结构体单例命名习惯,避免Gorm自动生成表名时出现复数混乱。

后续操作

如果之前已经执行过错误的迁移,需要先删除生成的friends表和friends表(原Friend模型对应的表),再重新运行Gorm迁移命令:

# 示例:用Gorm AutoMigrate重新生成表
db.AutoMigrate(&User{})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:01:18