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

上記のセルゲイの回答の下であなたの質問にコメントしようとしましたが、私はここに来たばかりなので、私には特権がありません。

Sergey が言ったように、構造体に GetUsers 関数が表示されませんgorm.DB。その場合db.Raw("select * from users").Scan(&users)、ステートメントに 2 つの変数を割り当てることはできません (どちらも行う必要はありません)。代わりに、次のようにします。

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

これは、DB.Scan() が DB 実装で 1 つの結果変数のみを返すためです。

// 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
}

質問にコンテキストが追加された後、回答が更新されました。

これは、実際に for を実装していないためGetUsersですgorm.DB。あなたがしたことは -controllersという名前のパッケージで構造体を定義し、その構造体にメソッドをUserアタッチしました。GetUsersInside controllers/User.GetUsersyou calledrepo.GetUsersが内部的に を呼び出そうとしますdb.GetUsers。メソッドが定義されていないdb型です。*gorm.DBGetUsers

修正する 1 つの方法は、Sergey が提案したように、単に実行することですdb.Raw(...).Scan(...)

本当に gorm.DB をカプセル化GetUsersし、db 接続からよりネイティブに見えるようにしたい場合は、次のことを試すことができます。

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

モデルでは、の代わりにdb型として宣言します。*MyDB*gorm.DB

この埋め込み手法に関する公式ドキュメントについては、https: //golang.org/doc/effective_go.html#embedding をご覧ください。

于 2016-09-19T00:53:26.370 に答える
1

あなたのコードに GetUsers function db this *gorm.DB が表示されず、GetUsers がありません。このようにする必要があります。 db..Raw("select * from users").Scan(&users)

于 2016-09-17T18:47:57.480 に答える