1

The base concept creating a Database Manager API for getting data through an API. I am using the GORM for getting data of the instances of the strcuts. So there is 300-400 struct which represents the tables.

type Users struct {
  ID int64
  Name string
}

type Categories struct {
  ID int64
  Category string
}

The next step I implement a function which is return the correct instance of the struct by table name, what I get through the API endpoint param.

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

After there is an operations struct where the only one field is the DB. There is methods, for example the GetLast() where I want to use the GORM db.Last(&users) function.

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

There is points so this is what I don't know. The current solution is not working because in this case it is an interface{} I need make a type assertion more info in this question. The type assertion is looks like:

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

This solution working, but in this case I lost the modularity. I try using the reflect.TypeOf(modelStruct), but it is also not working because the result of the reflect.TypeOf is a reflect.Type, with is not a golang type.

1 Answer 1

0

Basically I solved the problem, for getting the model as a pointer, and after I return it back as a json file.

So my model is the following:

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

And it is return back a new model by table type. what I can use for gorm First() function. Then json Marshal it, and return.

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

Before the return I clear the model pointer because the First() function store callbacks for the latest queries.

func clear(v interface{}) {
    p := reflect.ValueOf(v).Elem()
    p.Set(reflect.Zero(p.Type()))
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.