I'm new to Golang coming from a python background so trying to understand the new and different concepts. I'm trying to create related fields and then select them from the database.
Models:
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
}
Create tables and rows and select from 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)
This prints:
user name Alice
creditcard number 0
creditcard number related 123456
company name
company name related
Two questions:
Related
creditCard to a separate variable instead of using the dot notation?invalid association []
on the Related
company, and neither dot notation or Related work. How do I get this back?GORM provides First , Take , Last methods to retrieve a single object from the database, it adds LIMIT 1 condition when querying the database, and it will return the error ErrRecordNotFound if no record is found. // Get the first record ordered by primary key. db.First(&user)
Golang ORMs Luckily, the Go community has built a number of Object Relational Mapping libraries (ORMs) to allow Go developers to use JSON key:value pair syntax and encoding to map directly to a SQL database like PostgreSQL. ORMs enable developers to use their native programming paradigm to map data to SQL.
Gorm is an Irish (Gaelic) word meaning "blue". Ignorance is bliss => Ignorance means not having the blues. => Ignorance = Gormless.
According to documentation, you need to set auto_preload
to true
for Auto Preloading to work. So changing the line where you retrieve the user to:
common.DB.Set("gorm:auto_preload", true).First(&retrivedUser, 1)
should give you the expected result.
On a side note, never ignore the errors. You can always append .Error
to almost every operation in gorm
and check the returned error. For example:
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With