使用 GORM 选择相关字段
Selecting related fields with GORM
我是 Golang 的新手,有 python 背景,所以我想了解新的和不同的概念。
我正在尝试创建相关字段,然后 select 从数据库中获取它们。
型号:
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
创建表和行并 select
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
两个问题:
- 为什么我需要 select
Related
creditCard 到一个单独的变量而不是使用点符号?
- 我在
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
我是 Golang 的新手,有 python 背景,所以我想了解新的和不同的概念。 我正在尝试创建相关字段,然后 select 从数据库中获取它们。
型号:
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
创建表和行并 selectcommon.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
两个问题:
- 为什么我需要 select
Related
creditCard 到一个单独的变量而不是使用点符号? - 我在
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