Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Selecting related fields with GORM

Tags:

go

go-gorm

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:

  1. Why do I need to select Related creditCard to a separate variable instead of using the dot notation?
  2. I get error invalid association [] on the Related company, and neither dot notation or Related work. How do I get this back?
like image 809
lennard Avatar asked Apr 22 '19 09:04

lennard


People also ask

What is Gorm DB?

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)

What is ORM in Golang?

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.

What is Gorm?

Gorm is an Irish (Gaelic) word meaning "blue". Ignorance is bliss => Ignorance means not having the blues. => Ignorance = Gormless.


1 Answers

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
like image 175
ifnotak Avatar answered Oct 03 '22 09:10

ifnotak