Я пытаюсь сделать 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
}