如何使用GORM初始化带有外键约束的结构并将其插入数据库

如何使用GORM初始化带有外键约束的结构并将其插入数据库,go,go-gorm,Go,Go Gorm,我正试图用golang创建一个RESTAPI。每次创建用户时,我都会创建一个与该用户关联的“配置文件” 我最初的想法是首先创建用户,然后分别创建引用用户ID的概要文件并将其插入数据库 我不确定这种想法是否与应该使用的方式一致,因为我只是从语言开始 使用下面的代码,我创建了用户,但无法创建配置文件。我收到此错误:使用不可寻址值 var db *gorm.DB func GetDB() *gorm.DB { return db } type User struct { gorm.

我正试图用golang创建一个RESTAPI。每次创建用户时,我都会创建一个与该用户关联的“配置文件”

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

我不确定这种想法是否与应该使用的方式一致,因为我只是从语言开始

使用下面的代码,我创建了用户,但无法创建配置文件。我收到此错误:
使用不可寻址值

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

}
var db*gorm.db
func GetDB()*gorm.DB{
返回数据库
}
类型用户结构{
戈姆模型
电子邮件字符串`gorm:“类型:varchar(100);唯一索引”`
密码字符串`json:“密码”`
名称字符串`json:“名称”`
令牌字符串`json:“令牌”;sql:-”`
}
类型配置文件结构{
戈姆模型
User`gorm:“foreignkey:userrefere”`//使用userrefere作为外键
用户参考单元
FirstName字符串`gorm:“默认值:'John'”`
LastName字符串`gorm:“默认值:'Doe'”`
描述字符串'gorm:“默认值:'神秘'`
}
func(user*user)Create()(映射[字符串]接口{}){
如果resp,ok:=user.Validate();!ok{
返回响应
}
hashedPassword,:=bcrypt.GenerateFromPassword([]字节(user.Password),bcrypt.DefaultCost)
user.Password=string(hashedPassword)
GetDB().Create(用户)
配置文件:=配置文件{}
profile.userrefere=user.ID
GetDB().Create(配置文件)

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

GetDB()。创建(&profile)
但是,正如gorm中所示,自动创建关联

你可以改变你的模型,就像这样…(我假设用户和配置文件有一个1..1的关系,好吗?) 一切都会自动完成

类型用户结构{
戈姆模型
电子邮件字符串`gorm:“类型:varchar(100);唯一索引”`
密码字符串`json:“密码”`
名称字符串`json:“名称”`
令牌字符串`json:“令牌”;sql:-”`
剖面
轮廓标识单元
}
类型配置文件结构{
戈姆模型
用户标识单元
FirstName字符串`gorm:“默认值:'John'”`
LastName字符串`gorm:“默认值:'Doe'”`
描述字符串'gorm:“默认值:'神秘'`
}

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

GetDB()。创建(&profile)
但是,正如gorm中所示,自动创建关联

你可以改变你的模型,就像这样…(我假设用户和配置文件有一个1..1的关系,好吗?) 一切都会自动完成

类型用户结构{
戈姆模型
电子邮件字符串`gorm:“类型:varchar(100);唯一索引”`
密码字符串`json:“密码”`
名称字符串`json:“名称”`
令牌字符串`json:“令牌”;sql:-”`
剖面
轮廓标识单元
}
类型配置文件结构{
戈姆模型
用户标识单元
FirstName字符串`gorm:“默认值:'John'”`
LastName字符串`gorm:“默认值:'Doe'”`
描述字符串'gorm:“默认值:'神秘'`
}