首页 > 其他分享 >go gorm 通用微服务反射实现通用增删改查功能

go gorm 通用微服务反射实现通用增删改查功能

时间:2024-10-15 21:21:35浏览次数:3  
标签:通用 err self 改查 entity reflect var go return

package pagedb

import (
    "errors"
    "fmt"
    "git.ichub.com/general/webcli120/goconfig/base/basedto"
    "git.ichub.com/general/webcli120/goconfig/base/baseutils"
    "git.ichub.com/general/webcli120/goconfig/base/jsonutils"
    "git.ichub.com/general/webcli120/goconfig/base/stringutils"
    "git.ichub.com/general/webcli120/goconfig/ichublog/golog"
    dbpkgdto "git.ichub.com/general/webcli120/goweb/meta/db/pkg/dto"
    "git.ichub.com/general/webcli120/goweb/meta/db/pkg/service"
    "git.ichub.com/general/webcli120/goweb/page"
    "github.com/huandu/go-clone"
    "github.com/sirupsen/logrus"
    "reflect"
    "strings"
    "time"
)

type PagedbGroup struct {
    *PageDbRequest
    StatFieldTemplate string
}

func DefaultDbGroup() *PagedbGroup {
    var dbgroup = NewPagedbGroup()
    dbgroup.Init()
    return dbgroup
}
func NewPagedbGroup() *PagedbGroup {
    return &PagedbGroup{
       StatFieldTemplate: `
       sum(statField) statFieldSum,
       max(statField) statFieldMax,
       count(statField) statFieldCount,
       min(statField) statFieldMin,
       avg(statField) statFieldAvg    `,
    }
}

func (self *PagedbGroup) Init() {
    self.PageDbRequest = Default()
}

// var sql = `select groupFields, sum(statField)  ,max(statField),count(statField) ,
//
//  min(statField),count(statField) ,avg(statField)    from ` + self.TableName
func (self *PagedbGroup) Stat(statfield ...string) (map[string]any, error) {
    if self.PageDbRequest == nil {
       //return nil, errors.New("PageDbRequest is nil")
    }
    var result, err = self.GroupStat("", statfield[0])
    if err != nil {
       return nil, err
    }

    return result[0], nil
}
func (self *PagedbGroup) GroupStat(groupFields string, statfields ...string) ([]map[string]any, error) {
    var statfield = statfields[0]
    var fields = `groupFields, 
             sum(statField) sum,
             max(statField) max,
             count(statField) count,
             min(statField) min,
             avg(statField) avg `
    if groupFields == "" {
       fields = strings.ReplaceAll(fields, "groupFields,", "")
    } else {
       fields = strings.ReplaceAll(fields, "groupFields", groupFields)
    }
    fields = strings.ReplaceAll(fields, "statField", statfield)

    var dbc = self.GetDB().Table(self.TableName).Select(fields)
    if groupFields != "" {
       dbc = dbc.Group(groupFields)
    }
    dbc = dbc.Offset(self.Start()).Limit(self.PageSize)

    dbc = self.BuildWhere(dbc)
    if self.IfOrderBys() {
       dbc = self.Order(dbc)
    }
    var rows, err = dbc.Rows()
    if err != nil {
       golog.Error(err)
       return nil, err
    }
    defer func() {
       rows.Close()
    }()
    var records = make([]map[string]any, 0)

    var record = self.CreateStatStru(groupFields)
    for rows.Next() {
       record = clone.Clone(record)
       dbc.ScanRows(rows, record)
       records = append(records, jsonutils.Stru2Map(record))
    }

    golog.Info(records)
    return records, nil

}
func (self *PagedbGroup) CreateStatStru(groupFields string, statField ...string) any {

    var statFields = "Avg,Max,Min,Sum"
    dbFields := []reflect.StructField{}
    if groupFields != "" {
       for _, field := range strings.Split(groupFields, ",") {
          var colField = reflect.StructField{
             Name: stringutils.Capitalize(field),
             Type: reflect.TypeOf(""),
             Tag:  reflect.StructTag(`json:"` + stringutils.Lcfirst(field) + `"`),
          }
          dbFields = append(dbFields, colField)
       }

    }
    for _, field := range strings.Split(statFields, ",") {
       var colField = reflect.StructField{
          Name: stringutils.Capitalize(field),
          Type: reflect.TypeOf(""),
          Tag:  reflect.StructTag(`json:"` + stringutils.Lcfirst(field) + `"`),
       }
       dbFields = append(dbFields, colField)
    }

    var colField = reflect.StructField{
       Name: "Count",
       Type: reflect.TypeOf(int(0)),
       Tag:  `json:"count"`,
    }
    dbFields = append(dbFields, colField)

    colField = reflect.StructField{
       Name: "BaseEntity",
       Type: reflect.TypeOf(basedto.BaseEntity{}),
       Tag:  `json:"-"`,
    }
    dbFields = append(dbFields, colField)

    dbtableType := reflect.StructOf(dbFields)
    //初始化一个动态结构体实例
    var stru = reflect.New(dbtableType).Elem().Addr().Interface()
    //初始化baseentity some成员
    baseutils.IfProxy(stru)
    return stru

}
func (self *PagedbGroup) Insert(entity any) (map[string]any, error) {

    var err = self.GetDB().Table(self.TableName).Model(entity).Create(entity).Error
    if err != nil {
       logrus.Error(err.Error())
       return nil, err
    }
    var result = jsonutils.Stru2Map(entity)
    return result, err

}
func (self *PagedbGroup) FindPkName() string {
    var metadataFactroy = service.FindMetadataFactroy(self.DbClientDto)
    var metadata = metadataFactroy.FindMetaTable(self.TableName)
    var pk = metadata.PkInfo.PkName
    return pk
}
func (self *PagedbGroup) Update(entity any, v any) (any, error) {
    var pk = self.FindPkName()
    var err = self.GetDB().Table(self.TableName).Model(entity).Where(pk+"=?", v).Update(entity).Error
    if err != nil {
       golog.Error(err)
       return entity, err
    }
    return jsonutils.Stru2Map(entity), err
}

// no primary key will insert
func (self *PagedbGroup) Save(entity any, pk string, v any) (any, error) {

    var err = self.GetDB().Table(self.TableName).Model(entity).Where(pk+"=?", v).Save(entity).Error
    if err != nil {
       golog.Error(err)
       return entity, err
    }
    return jsonutils.Stru2Map(entity), err
}

func (self *PagedbGroup) CreateTableRecord() (any, error) {

    var entity, err = self.CreateTableStru()
    if err != nil {
       return nil, err
    }
    return entity.Addr().Interface(), err
}
func (self *PagedbGroup) CreateTableStru() (reflect.Value, error) {
    var metadataFactroy = service.NewMetadataFactroy(self.DbClientDto)
    var metadata = metadataFactroy.FindMetaTable(self.TableName)
    if !metadata.TableExist {
       return reflect.ValueOf(nil), errors.New("table not exist")
    }
    return self.CreateDbTableStru(metadata), nil
}
func (self *PagedbGroup) CreateDbTableStru(meta *dbpkgdto.MetaTableDto) reflect.Value {
    // logrus.Info("CreateDbTableStru meta=", meta.ToPrettyString())
    var metaColService = service.FindMetadataFactroy(self.DbClientDto)
    dbFields := []reflect.StructField{}

    for _, col := range meta.Columns {
       //logrus.Info("CreateDbTableStru col=", col.ToPrettyString())
       var colType = metaColService.FindGoType(col.DataType)
       var ColTyp8 = reflect.TypeOf(int8(0))

       var ct = func(colType string) *reflect.Type {
          var ColTyp = reflect.TypeOf(int8(0))
          switch colType {
          case "float32":
             ColTyp = reflect.TypeOf(float32(0))
          case "float64":
             ColTyp = reflect.TypeOf(float64(0))
          case "int64":
             ColTyp = reflect.TypeOf(int64(0))
          case "int32":
             ColTyp = reflect.TypeOf(int32(0))
          case "int16":
             ColTyp = reflect.TypeOf(int16(0))
          case "uint64":
             ColTyp = reflect.TypeOf(uint64(0))
          case "uint32":
             ColTyp = reflect.TypeOf(uint32(0))
          case "uint16":
             ColTyp = reflect.TypeOf(uint16(0))
          case "string":
             ColTyp = reflect.TypeOf("")
          case "bool":
             ColTyp = reflect.TypeOf(true)
          case "byte":
             ColTyp = reflect.TypeOf(byte(0))
          case "[]byte":
             ColTyp = reflect.TypeOf([]byte{})

          case "time.Time":
             ColTyp = reflect.TypeOf(time.Now())
             if col.ColumnName == "deleted_at" {
                var t *time.Time
                ColTyp = reflect.TypeOf(t)

             }

          }
          return &ColTyp
       }(colType)
       if ColTyp8 != *ct {
          if self.IfExistField(col.ColumnName) {
             //colField.Tag = reflect.StructTag(fmt.Sprintf("json:\"%s\"", col.ColumnName))
             var name = stringutils.Case2Camel(col.ColumnName)
             name = strings.ReplaceAll(name, ",", "")
             var colField = reflect.StructField{
                Name: name,
                Type: *ct,
                Tag:  reflect.StructTag(fmt.Sprintf("json:\"%s\"", col.ColumnName)),
             }
             //or primary key
             if col.ColumnName == "id" {
                colField.Tag = reflect.StructTag(`gorm:"column:id;type:INT8;PRIMARY_KEY;default:unique_rowid()" json:"id"`)
             }
             dbFields = append(dbFields, colField)
          }
       }
    }

    dbtableType := reflect.StructOf(dbFields)
    return reflect.New(dbtableType).Elem()

}

func (self *PagedbGroup) UpdateNotNull(pkeyValue any, maps map[string]any) (any, error) {

    var entity, _ = self.CreateTableRecord()

    var pk = self.FindPkName()
    err := self.GetDB().Table(self.TableName).Model(entity).Where(pk+"=?", pkeyValue).Updates(maps).Error
    if err != nil {
       logrus.Error(err.Error())
       return entity, err
    }
    return err, err
}
func (self *PagedbGroup) DeleteById(pkey any) error {
    var entity, _ = self.CreateTableRecord()
    var pk = self.FindPkName()
    err := self.GetDB().Table(self.TableName).Where(pk+"=?", pkey).Delete(&entity).Error
    return err
}

func (self *PagedbGroup) FindById(pkey any) (any, bool, error) {
    var entity, _ = self.CreateTableRecord()
    var pk = self.FindPkName()
    db := self.GetDB().Table(self.TableName).First(entity, pk+"=?", pkey)

    return entity, db.RecordNotFound(), db.Error

}

func (self *PagedbGroup) GeneralScanTable() *page.PageResult {
    return self.PageDbRequest.GeneralScanTable()
}

标签:通用,err,self,改查,entity,reflect,var,go,return
From: https://blog.csdn.net/leijmdas/article/details/142964877

相关文章

  • 基于django+vue+Vue基于MD5社区老年人信息管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着全球老龄化趋势的加剧,社区老年人管理成为了一个亟待解决的问题。当前,关于老年人信息管理的研究主要集中在医疗健康、社会保障等单一领......
  • 【Linux探索学习】第五弹——Linux用户管理:创建、删除与查看普通用户
    前言:Linux下创建普通用户是我们以后经常要做的一件事,一个超级用户下可以有多个普通用户,这样我们就可以用这些普通用户去做不同的事情,所以学习如何创建并管理这些用户就显得尤为重要提醒:本篇是在Ubuntu系统下进行的操作目录一、创建普通用户二、测试是否创建成功方法一......
  • P10851 [EGOI2024] Make Them Meet / 活动面基
    构造题做的太少了,感觉这题是非常厉害的构造题。考虑菊花图。菊花图结构非常简单,我的做法是先让所有点颜色相同,这样如果两个人分别在叶子上就可以在根相遇,否则一定会有一人走到根上,再与叶子挨个匹配即可。考虑链的做法。我们可以考虑把两个人往中间赶,他们肯定可以相遇。但是这种......
  • 基于django+vue+Vue基于J2EE的电子商务库存管理系统【开题报告+程序+论文】-计算机毕
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景电子商务的迅猛发展推动了库存管理系统的不断升级与优化。当前,关于库存管理系统的研究主要集中在自动化、智能化以及大数据应用等方面,但这......
  • 基于django+vue+Vue基于html小说网站的设计与实现【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着互联网技术的快速发展,网络文学已成为当代文化消费的重要组成部分。众多小说网站如雨后春笋般涌现,为读者提供了丰富的阅读资源。然而,关......
  • 基于django+vue+Vue基于MD5加密的电子书籍在线阅读系统设计与实现【开题报告+程序+论
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着信息技术的飞速发展,电子书籍已成为现代人获取知识、阅读学习的重要方式之一。关于电子书籍在线阅读系统的研究,现有研究主要以技术实现......
  • 基于django+vue+Vue基于J2EE的猎头公司招聘管理【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景关于猎头公司招聘管理的研究,现有研究主要以招聘流程优化、人才识别与评估技术为主,但专门针对猎头公司特有的招聘管理系统及其运作机制的研......
  • 基于django+vue+Vue基于J2EE的电子商务库存管理系统【开题报告+程序+论文】-计算机毕
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景电子商务的迅猛发展推动了库存管理系统的不断升级与优化。当前,关于库存管理系统的研究主要集中在自动化、智能化以及大数据应用等方面,但这......
  • 基于django+vue+Vue基于html小说网站的设计与实现【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着互联网技术的快速发展,网络文学已成为当代文化消费的重要组成部分。众多小说网站如雨后春笋般涌现,为读者提供了丰富的阅读资源。然而,关......
  • I2C相关结构体讲解:i2c_adapter、i2c_algorithm、i2c_msg
    往期内容I2C子系统专栏:I2C(IIC)协议讲解SMBus协议详解总线和设备树专栏:专栏地址导航篇–专栏未篇1.框图建议右击图片在新标签页打开预览i2c_transfer函数就是读取i2c设备的信息或者输出信息给i2c设备的函数比如发送app发送数据给i2c设备,i2c设备的驱动程序......