Использование операторов crud в общем случае c - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь сделать Go DAL, и для этого я в основном использовал GORM.

Теперь я попытался сделать свой DAL как можно более абстрактным, чтобы иметь возможность запрашивать множество таблиц.

Проблема в том, что я должен повторяться для каждой структуры таблицы - отражения моей БД.

Давайте рассмотрим пример:

Вот две структуры, по одной для каждой таблицы в моя база данных:

type Cad_check_status struct {
    Id int
    Status_code int
    Last_update Timestamp
    Path string
    Ref_num int
    System_code int
}

type Cad_check_errors struct {
    Id int
    check_status int
    error_code Timestamp
}

И здесь их соответствующие функции Retrieve (по одной для каждой, даже если их общая сумма одинакова, за исключением случая создания экземпляра структуры, который здесь является главной проблемой):

func StatusRetrieve(db *CDb, keyval map[string]interface{}) ([]byte, error){
    atts :=  []Cad_check_status{} // <===== this is my problem, the only difference between the two functions
    errors := db.Where(keyval).Find(&atts).GetErrors()
    err := HandleDBErrors(errors)
    if err != nil {
        return nil, err
    }
    b, _ := json.Marshal(atts)
    return b, nil
  }

func ErrorsRetrieve(db *CDb, keyval map[string]interface{}) ([]byte, error){
    atts :=  []Cad_check_errors{} // <=== my problem again, the rest is the same
    errors := db.Where(keyval).Find(&atts).GetErrors()
    err := HandleDBErrors(errors)
    if err != nil {
        return nil, err
    }
    b, _ := json.Marshal(atts)
    return b, nil
}

Пока я пытался сделать что-то вроде этого:

func Retrieve (tableStruct interface{}, db *CDb, keyval map[string]interface{})([]byte, error) {
    atts :=  []tableStruct{} //<=== but of course this is IMPOSSIBLE ! but you got the idea....
    errors := db.Where(keyval).Find(&atts).GetErrors()
    err := HandleDBErrors(errors)
    if err != nil {
        return nil, err
    }
    b, _ := json.Marshal(atts)
    return b, nil
}

1 Ответ

1 голос
/ 17 марта 2020

На самом деле ваш последний образец работает просто отлично, если вы используете его правильно:

func Retrieve (atts interface{}, db *CDb, keyval map[string]interface{})([]byte, error) {
    errors := db.Where(keyval).Find(atts).GetErrors()
    err := HandleDBErrors(errors)
    if err != nil {
        return nil, err
    }
    b, _ := json.Marshal(atts)
    return b, nil
}

var values []Cad_check_status
json,err := Retrieve(&values, db, keyval)
...