go - 使用 GORM 选择相关字段

标签 go go-gorm

我是 Golang 的新手,有 python 背景,所以我想了解新的和不同的概念。 我正在尝试创建相关字段,然后从数据库中选择它们。

模型:

type Company struct {
    gorm.Model
    Name string
}

type CreditCard struct {
    gorm.Model
    Number    int
    Company   Company
    CompanyId uint
}

type User struct {
    gorm.Model
    Name         string
    CreditCard   CreditCard
    CreditCardID uint
}

创建表和行并从数据库中选择

common.DB.AutoMigrate(
    &Company{},
    &CreditCard{},
    &User{},
)

user := User{
    Name:       "Alice",
    CreditCard: CreditCard{Number: 123456, Company: Company{Name: "Bank A"}},
}

common.DB.Create(&user)

var retrivedUser User
var creditCard CreditCard
var company Company
common.DB.First(&retrivedUser, 1).Related(&creditCard).Related(&company)

fmt.Println("user name", retrivedUser.Name)
fmt.Println("creditcard number", retrivedUser.CreditCard.Number)
fmt.Println("creditcard number related", creditCard.Number)
fmt.Println("company name", retrivedUser.CreditCard.Company.Name)
fmt.Println("company name related", company.Name)

这打印:

user name Alice
creditcard number 0
creditcard number related 123456
company name 
company name related 

两个问题:

  1. 为什么我需要选择 Related creditCard 到一个单独的变量而不是使用点符号?
  2. 我在 Related 公司上收到错误 invalid association [],既没有点符号也没有相关工作。我该如何取回它?

最佳答案

根据 documentation ,您需要将 auto_preload 设置为 true 才能使自动预加载工作。因此,将检索用户的行更改为:

common.DB.Set("gorm:auto_preload", true).First(&retrivedUser, 1)

应该会给你预期的结果。


附带说明,永远不要忽略错误。您始终可以将 .Error 附加到 gorm 中的几乎每个操作并检查返回的错误。例如:

err = common.DB.AutoMigrate(...).Error
if err != nil {
    // handle err
}

err = common.DB.Create(&user).Error
// Check for err
err = common.DB.Set("gorm:auto_preload", true).First(&retrivedUser, 1).Error
// Check for err

关于go - 使用 GORM 选择相关字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55792332/

相关文章:

go - 为什么在条件 Go 模板中使用破折号

go - 连接Gorm和Gin Golang

postgresql - 如何正确分组 Postgres 数据

Gorm 从具有嵌套表条件的表中获取所有数据

go - 为什么使用golang的mgo库找不到id?

json - 在 Golang Structs 和 Json 之间动态转换

go模块没有正确下载动态库的cgo软链接(soft link)

go - 错误reflect.ValueOf(val).IsZero未定义(类型reflect.Value没有字段或方法IsZero

go - 如何按Gorm中的角色过滤用户?

go - 将整数数组中的数字加入 Golang 中的一个数字?