我是刚从python背景来到golang的,所以我试着理解新的和不同的概念。
我正在尝试创建相关字段,然后从数据库中选择它们。
模型:

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

两个问题:
为什么我需要选择Related信用卡到一个单独的变量,而不是使用点符号?
我在公司里得到了错误信息,既没有点符号也没有相关的工作。我怎么把这个拿回来?

最佳答案

根据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

07-26 00:00
查看更多