package dao import ( "reflect" "git.rosy.net.cn/baseapi/utils" "git.rosy.net.cn/jx-callback/business/jxutils" "github.com/astaxie/beego/orm" ) type DaoDB struct { db orm.Ormer } // func GetRows(db *gorm.DB, inPtr interface{}, sql string, values ...interface{}) (err error) { // if db == nil { // db = gormdb.GetDB() // } // topTypeInfo := reflect.TypeOf(inPtr) // if topTypeInfo.Kind() != reflect.Ptr { // panic("SelectEntities inPtr should be slice ptr (*[]Type)") // } // typeInfo := topTypeInfo.Elem() // if typeInfo.Kind() != reflect.Slice { // panic("SelectEntities inPtr should be slice ptr (*[]Type)") // } // elmType := typeInfo.Elem() // valueInfo := reflect.ValueOf(inPtr) // rows, err := db.Raw(sql, values...).Rows() // if err == nil { // defer rows.Close() // for rows.Next() { // var value reflect.Value // if elmType.Kind() == reflect.Ptr { // value = reflect.New(elmType.Elem()) // } else { // value = reflect.New(elmType) // } // db.ScanRows(rows, value.Interface()) // if elmType.Kind() != reflect.Ptr { // value = value.Elem() // } // valueInfo.Elem().Set(reflect.Append(valueInfo.Elem(), value)) // } // return nil // } // return err // } // beego orm的对于传代表字段的字串,数据库字段名(完全匹配,区分大小写),结构体字段名(不区分大小写)都可以 func GetDB() *DaoDB { return &DaoDB{db: orm.NewOrm()} } func GetRow(db *DaoDB, inPtr interface{}, sql string, values ...interface{}) (err error) { if db == nil { db = GetDB() } return db.db.Raw(sql, values).QueryRow(inPtr) } func GetRows(db *DaoDB, inPtr interface{}, sql string, values ...interface{}) (err error) { if db == nil { db = GetDB() } _, err = db.db.Raw(sql, values).QueryRows(inPtr) return err } func GetEntity(db *DaoDB, item interface{}, cols ...string) (err error) { if db == nil { db = GetDB() } err = utils.CallFuncLogError(func() error { return db.db.Read(item, cols...) }, reflect.TypeOf(item).Name()) return err } func UpdateEntity(db *DaoDB, item interface{}, cols ...string) (num int64, err error) { if db == nil { db = GetDB() } err = utils.CallFuncLogError(func() error { num, err = db.db.Update(item, cols...) return err }, reflect.TypeOf(item).Name()) return num, err } func UpdateEntityByKV(db *DaoDB, item interface{}, kvs map[string]interface{}, conditions map[string]interface{}) (num int64, err error) { if db == nil { db = GetDB() } err = utils.CallFuncLogError(func() error { qs := db.db.QueryTable(item) if conditions == nil { qs = qs.Filter("id", jxutils.GetObjFieldByName(item, "ID")) } else { for k, v := range conditions { qs = qs.Filter(k, v) } } num, err = qs.Update(kvs) return err }, reflect.TypeOf(item).Name()) return num, err } func CreateEntity(db *DaoDB, item interface{}) (err error) { if db == nil { db = GetDB() } err = utils.CallFuncLogError(func() error { _, err = db.db.Insert(item) // todo 这里需要将ID赋值么? return err }, reflect.TypeOf(item).Name()) return err } func DeleteEntity(db *DaoDB, item interface{}, conditions map[string]interface{}) (num int64, err error) { if db == nil { db = GetDB() } err = utils.CallFuncLogError(func() error { if len(conditions) == 0 { num, err = db.db.Delete(item) } else { qs := db.db.QueryTable(item) for k, v := range conditions { qs = qs.Filter(k, v) } num, err = qs.Delete() } return err }, reflect.TypeOf(item).Name()) return 0, err }