Binajmen
Binajmen

Reputation: 506

Fatal error when retrieving multiple rows with gorm Find()

I'm stuck with an obvious operation: retrieving multiple rows using gorm.Find() method.

(resolver.go)

package resolver

type Root struct {
    DB *gorm.DB
}

func (r *Root) Users(ctx context.Context) (*[]*UserResolver, error) {
    var userRxs []*UserResolver
    var users []model.User

    // debug-start
    // This is to prove r.DB is allocated and working
    // It will print {2 [email protected]} in the console
    var user model.User
    r.DB.Find(&user)
    log.Println(user)
    // debug-end

    if err := r.DB.Find(&users); err != nil { // <-- not working
        log.Fatal(err)
    }

    for _, user := range users {
        userRxs = append(userRxs, &UserResolver{user})
        log.Println(user)
    }

    return &userRxs, nil
}
(model.go)

package model

type User struct {
    ID    graphql.ID `gorm:"primary_key"`
    Email string     `gorm:"unique;not null"`
}

The mysql table is filled with 2 values. Here is the content in json style:

{
  { Email: [email protected] },
  { Email: [email protected] },
}

This is the result when I run the program:

2020/05/13 12:23:17 Listening for requests on :8000
2020/05/13 12:23:22 {2 [email protected]}
2020/05/13 12:23:22 &{{{0 0} 0 0 0 0} 0xc0004cee40 <nil> 2 0xc00031e3c0 false 0 {0xc00035bea0} 0xc0004b3080 {{0 0} {<nil>} map[] 0} 0xc000408340 <nil> 0xc0004cee60 false <nil>}

What is wrong with my code? It seems from all the tuto/so/etc.. sources that I'm correctly defining a slice var and passing it to the Find() function..

Upvotes: 1

Views: 536

Answers (2)

SystemGlitch
SystemGlitch

Reputation: 2262

You need to use a slice of pointers:

users := make([]*model.User, 0, 2)
if err := r.DB.Find(&users).Error; err != nil {
    log.Fatal(err)
}

Upvotes: 1

Oleg
Oleg

Reputation: 742

if err := r.DB.Find(&users); err != nil { // <-- not working
    log.Fatal(err)
}

Probably you forgot to mention Error property and returned object in this case is not nil for sure (please mention that Find returns not error interface in this case)

Please try something like that

if err := r.DB.Find(&users).Error; err != nil {
    log.Fatal(err)
}

Hope it helps

Upvotes: 3

Related Questions