2017-02-04 4 views
1

APIを使用してデータを取得するためのデータベース・マネージャーAPIを作成する基本概念。私はstrcutsのインスタンスのデータを取得するためにGORMを使用しています。したがって、テーブルを表す300〜400の構造体があります。Golangデータベース・マネージャーのAPI概念、型アサーションのエラー

type Users struct { 
    ID int64 
    Name string 
} 

type Categories struct { 
    ID int64 
    Category string 
} 

私はAPIエンドポイントのparamを通じて得るもの、テーブル名によって構造体の正しいインスタンスを返すような関数を実装して次のステップ。

func GetModel(model string) interface{} { 
    switch model { 
    case "users": 
    return Users{} 
    case "categories" 
    return Categories{} 
    } 
    return false 
} 

1つのフィールドだけがDBである操作構造体があるとします。 GORM db.Last(& users)関数を使用したいGetLast()メソッドなどのメソッドがあります。

func (o Operations) GetLast(model string) interface{} { 
    modelStruct := GetModel(model) 
    . 
    . 
    . 
    return o.DB.Last(&modelStruct) 
} 

これは私が知らない点です。現在の解決策は動作していません。このケースではインタフェース{}なので、タイプアサーションを作成する必要がありますmore info in this question。タイプアサーションは次のようになります。

このソリューションは機能しますが、この場合はモジュール性が失われます。私はreflect.TypeOf(modelStruct)を使用しようとしていますが、reflect.TypeOfの結果がreflect.Typeであり、golangタイプではないため動作しません。

答えて

0

基本的には、モデルをポインタとして取得し、それをjsonファイルとして返すと、問題が解決しました。

だから私のモデルは次のとおりです。

var Models = map[string]interface{}{ 
    "users": new(Users), 
    "categories": new(Categories), 
} 

そして、それはテーブルタイプによって新しいモデルを戻らです。私がgorm First()関数のために使うことができるもの。それからjsonマーシャリングして帰ります。

func (o Operation) First(model string, query url.Values) string { 
    modelStruct := Models[model] 
    db := o.DB 
    db.First(modelStruct) 
    response, _ := json.Marshal(modelStruct) 
    clear(modelStruct) 
    return string(response) 
} 

戻る前に、First()関数は最新のクエリのコールバックを格納するため、モデルポインタをクリアします。

func clear(v interface{}) { 
    p := reflect.ValueOf(v).Elem() 
    p.Set(reflect.Zero(p.Type())) 
}