【问题标题】:How to init and insert struct with foreign key constraint into db using GORM如何使用 GORM 初始化具有外键约束的结构并将其插入到数据库中
【发布时间】:2019-06-13 09:49:31
【问题描述】:

我正在尝试使用 golang 创建一个 rest API。每次创建用户时,我都想创建一个与该用户关联的“个人资料”。

我最初的想法是首先创建用户,然后分别创建引用用户 ID 的配置文件并将其插入数据库。

我不确定是否应该使用这种思维方式,因为我只是从语言开始。

使用下面的代码,我创建了用户,但无法创建配置文件。我收到此错误:using unaddressable value

var db *gorm.DB

func GetDB() *gorm.DB {
    return db
}

type User struct {
    gorm.Model
    Email    string `gorm:"type:varchar(100);unique_index"`
    Password string `json:"password"`
    Name     string `json:"name"`
    Token    string `json:"token";sql:"-"`
}

type Profile struct {
    gorm.Model
    User        User `gorm:"foreignkey:UserRefer"` // use UserRefer as foreign key
    UserRefer   uint
    FirstName   string `gorm:"default:'John'"`
    LastName    string `gorm:"default:'Doe'"`
    Description string `gorm:"default:'Mysterious'"`
}

func (user *User) Create() (map[string]interface{}) {

    if resp, ok := user.Validate(); !ok {
        return resp
    }

    hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
    user.Password = string(hashedPassword)

    GetDB().Create(user)

    profile := Profile{}
    profile.UserRefer = user.ID

    GetDB().Create(profile)

    if user.ID <= 0 {
        return u.Message(false, "Failed to create account, connection error.")
    }

    response := u.Message(true, "Account has been created")
    response["user"] = user

    return response

}

我希望有人能够帮助我了解这里出了什么问题?

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    您应该在 gorm 的 Create 方法上传递一个指针,以便在创建后填充您的模型...

    GetDB().Create(&profile)
    

    但是,正如https://gorm.io/docs/associations.htmlgorm 中所示,自动创建关联。

    你可以改变你的模型,像这样......(我假设 User 和 Profile 有 1..1 关系好吗?) 一切都会自动完成

    type User struct {
        gorm.Model
        Email     string `gorm:"type:varchar(100);unique_index"`
        Password  string `json:"password"`
        Name      string `json:"name"`
        Token     string `json:"token";sql:"-"`
        Profile   Profile
        ProfileID uint
    }
    
    type Profile struct {
        gorm.Model
        UserID      uint
        FirstName   string `gorm:"default:'John'"`
        LastName    string `gorm:"default:'Doe'"`
        Description string `gorm:"default:'Mysterious'"`
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-17
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      相关资源
      最近更新 更多