0

我是 golang 的新手,正在尝试使用 gin + gorm 制作 API 服务器。
我尝试构建下面的代码,但type *gorm.DB has no field or method GetUsers出现错误。
这是一个非常简单的 API 服务器,我只想从users表中获取所有用户。

package models

import (
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/postgres"
)

var db *gorm.DB

func init() {
    var err error
    db, err = gorm.Open("postgres", "host=localhost dbname=test user=postgres password=test sslmode=disable")
    if err != nil {
        return err
    }
}

type User struct {
   ID           int    `json:"id"`
   Username     string `json:"name"`
}

func NewUser(id int, name string) User {
    return User{
      ID:           id,
      Username:     name,
    }
}

// UserRepository
type UserRepository struct {
}

func NewUserRepository() UserRepository {
    return UserRepository{}
}

func (m UserRepository) GetUsers() []*User {
    var users []*User
    has, _ := db.GetUsers(&users)
    if has {
         return users
    }
    return nil
}

我实现GetUsers()controllers/user.go,我还创建了users表。
我不知道为什么会这样说no field or method GetUsers。有人给我一个解决这个问题的建议。

package controllers

import (
     "api-server/models"
)

type User struct {
}

func NewUser() User {
     return User{}
}

func (c User) GetUsers() interface{} {
     repo := models.NewUserRepository()
     user := repo.GetUsers()
     return user
}
4

2 回答 2

1

如果我在你的代码中看到我没有看到 GetUsers 函数 db 这个 *gorm.DB 并且没有 GetUsers 你需要这样 db..Raw("select * from users").Scan(&users)

于 2016-09-17T18:47:57.480 回答
1

试图在上面谢尔盖的回答下评论你的问题,但我没有特权,因为我是新来的。

正如谢尔盖所​​说,我在结构中看不到 GetUsers 函数gorm.DB。如果这样做db.Raw("select * from users").Scan(&users),则不能(也不需要)将两个变量分配给语句。相反,只需:

db.Raw("select * from users").Scan(&users)

这是因为 DB.Scan() 在您的数据库实现中只返回一个结果变量:

// Scan scan value to a struct
func (s *DB) Scan(dest interface{}) *DB {
    return s.clone().NewScope(s.Value).Set("gorm:query_destination",dest).callCallbacks(s.parent.callbacks.queries).db
}

将更多上下文添加到问题后更新了答案:

那是因为你实际上并没有实现GetUsersfor gorm.DB。您所做的是 - 在controllers名为 的包中定义一个结构User,并将一个GetUsers方法附加到该结构。在controllers/User.GetUsers你调用repo.GetUsers的内部尝试调用db.GetUsers. db*gorm.DB没有GetUsers定义方法的类型。

一种解决方法是按照 Sergey 的建议,只做db.Raw(...).Scan(...).

如果你真的想封装 gorm.DB 并让GetUsersdb 连接看起来更原生,你可以尝试的一件事是:

type MyDB struct {
    gorm.DB
}
func (m *MyDB) GetUsers() []*Users {
    // do things like m.Raw(...).Scan(...)
}

在您的模型中,您声明db为 type*MyDB而不是*gorm.DB.

有关此嵌入技术的更多官方文档,请查看https://golang.org/doc/effective_go.html#embedding

于 2016-09-19T00:53:26.370 回答