Как без указания типов работать с базой в Го?

Привет всем
Есть функции, которые добавляют/удаляют/обновляеют данные в таблицах базы данных. Работаю через "ОРМ-пакет" github.com/eaigner/hood.
Пока есть 6-ть таблиц. Но уже вижу, что 99% кода один и тот же, где вместо var results []BuilderVersions надо var results []BuilderRepo
Я решил попробовать реализовать это через универсальную функцию, но столкнулся с тем, что Я не могу получить количество результатов ( num := len(num) ) invalid argument results (type interface {}) for len:
// Find Data
func (Builder *Builder) FindInDB(what string, where_string hood.Path, results interface{}) (interface{}, int, error) {
	var hd = Builder.Con.Hd
	err := hd.Where(where_string, "=", what).Find(results)
	if err != nil {
		panic(err)
	}
       //num := len(num)
	num := 1
	
	resultsret := results
	return resultsret, num, err
}


var results []BuilderRdeVersions
	fmt.Println("---1 ")
	resultsret, num, err := Builder.FindInDB("1.3", "rde_version", &results)
	fmt.Println("---2 ")
	fmt.Println("")
	fmt.Printf("resultsret %v\n", resultsret)
	fmt.Printf("num %v\n", num)
	fmt.Printf("err%v\n", err)


Результат:
---1
---=
---=
tets
---2

resultsret &[{40 1.3}]
num 1
err<nil>


Это моя примерная функция, из которой я делал универсальную

package builder
import (
         "fmt"
        _ "github.com/eaigner/hood"
        _ "github.com/ziutek/mymysql/godrv"
        _ "io/ioutil"
        _ "os"
	_ "github.com/docopt/docopt-go"
)

type Con struct {
	jsonobject Cfgbject
	Dsn        string
	Driver     string
	Hd         *hood.Hood
	Connected  bool
	Log	bool
}

type BuilderRdeVersions struct {
	RdeId      hood.Id
	Version string `sql:"size(55)"`
}
func (Builder *Builder) AddNewVersionToDB(ver string,repository string, forceupdate bool) (err error) {
	var hd = Builder.Con.Hd
	// Find If exist
	var results []BuilderVersions
	err = hd.Where("version", "=", ver).Find(&results)
	if err != nil {
	        panic(err)
	}
	n:=len(results)
	if n>0 && forceupdate==false {
		fmt.Printf("There are already exist version = %v use --force-update to udpate it \n",ver)
		return fmt.Errorf(" There are already exist version %v",ver)
	}else{
		//update - delete exist
		if n>0 {
			Builder.DeleteVersion(ver,false)
		}
		new_ver := BuilderVersions{RdeVersion:ver}
		tx := hd.Begin()
		_, err := tx.Save(&new_ver)
		if err != nil {
			panic(err)
		}
		// Commit changes
		err = tx.Commit()
		if err != nil {
			panic(err)
		}
		new_ver_path:=BuilderRepo{Repo: repository, VersionId: int64(new_ver.Id)}
	        tx1:= hd.Begin()
		_, err =tx1.Save(&new_ver_path)
		err = tx1.Commit()
		if err != nil {
	                panic(err)
	        }
	return nil
	}
}
  • Вопрос задан
  • 2418 просмотров
Пригласить эксперта
Ответы на вопрос 1
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Не уверен, что понял логику кода, но может быть

// Find Data
func (Builder *Builder) FindInDB(what string, where_string hood.Path, results []interface{}) (interface{}, int, error) {
var hd = Builder.Con.Hd
err := hd.Where(where_string, "=", what).Find(results)
if err != nil {
panic(err)
}
num := len(results)
num := 1

resultsret := results
return resultsret, num, err
}

var results []BuilderRdeVersions
fmt.Println("---1 ")
resultsret, num, err := Builder.FindInDB("1.3", "rde_version", results)
fmt.Println("---2 ")
fmt.Println("")
fmt.Printf("resultsret %v\n", resultsret)
fmt.Printf("num %v\n", num)
fmt.Printf("err%v\n", err)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы