【问题标题】:Selecting related fields with GORM使用 GORM 选择相关字段
【发布时间】:2019-04-22 09:39:27
【问题描述】:

我是来自 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
}

创建表和行并从 db 中选择

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 [],点符号或相关工作都没有。我该如何取回这个?

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

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

    【讨论】:

    • 谢谢,比预加载每个相关的表要容易得多。也感谢.Error 的提示!
    • 你知道这是在做连接还是另一个查询(如果使用关系数据库)?
    猜你喜欢
    • 2016-12-11
    • 1970-01-01
    • 2020-02-01
    • 2013-11-09
    • 2016-06-04
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多