首页 > 其他分享 >go gorm StructField动态生成结构体查询多条表记录

go gorm StructField动态生成结构体查询多条表记录

时间:2024-10-13 10:47:06浏览次数:10  
标签:return err StructField self reflect var dbc go gorm

water/goweb

func Test013_GeneralScanTable(t *testing.T) {

    var dbRequest = Default().SetPageSize(3)

    dbRequest.TableName = "sys_dept"
    dbRequest.FieldsName = "dept_id,dept_name" //dbRequest.SetQueryAll(true)
    var result = dbRequest.GeneralScanTable()
    golog.Info(result)

}

2024-10-13 10:51:45.312 [INFO] {
     "code": 200,
     "msg": "成功",
     "page_size": 3,
     "current": 1,
     "total": 10,
     "data": [
          {
               "DeptId": 100,
               "DeptName": "若依科技"
          },
          {
               "DeptId": 101,
               "DeptName": "深圳总公司"
          },
          {
               "DeptId": 102,
               "DeptName": "长沙分公司"
          }
     ],
     "data_agg": null,
     "data_highlight": null,
     "hosturl": ""
}

func (self *PagedbRequest) GeneralScanTable() *page.PageResult {
    var metadataFactroy = service.FindBeanMetadataFactroy() //(self.DbClientDto)
    var metadata = metadataFactroy.FindMetadata(self.TableName)
    if !metadata.TableExist {
       return page.ResultFailedPageResultErr(errors.New("table not exist"))
    }
    var dbentity = self.CreateDbTableStru(metadata)
    var records, err = self.ScanTable(dbentity.Addr().Interface())

    if err != nil {
       return page.ResultFailedPageResultErr(err)
    }

    var result = page.DefaultResult()
    result.PageCurrent = self.PageCurrent
    result.PageSize = self.PageSize
    result.Total, _ = self.CountTable(self.TableName)
    result.Data = records
    return result

}
func (self *PagedbRequest) CreateDbTableStru(meta *metadata.MetadataTable) reflect.Value {
    // logrus.Info("CreateDbTableStru meta=", meta.ToPrettyString())
    var metaColService = service.NewMetadataFactroy()
    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 "float64":
             ColTyp = reflect.TypeOf(float64(0))
          case "int64":
             ColTyp = reflect.TypeOf(int64(0))
          case "int32":
             ColTyp = reflect.TypeOf(int64(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())

          }
          return &ColTyp
       }(colType)
       if ColTyp8 != *ct {
          var colField = reflect.StructField{
             Name: stringutils.Case2Camel(col.ColumnName),
             Type: *ct,
          }
          if self.IfExistField(col.ColumnName) {
             //colField.Tag = reflect.StructTag(fmt.Sprintf("json:\"%s\"", col.ColumnName))

             dbFields = append(dbFields, colField)
          }
       }
    }

    dbtableType := reflect.StructOf(dbFields)
    dbentity := reflect.New(dbtableType).Elem()
    return dbentity
}
func (self *PagedbRequest) ScanTable(dbentity any) (any, error) {

    var records = []any{} //reflect.New(reflect.SliceOf(dbtableType)).Elem()

    var dbc = self.FindScanTable()
    var rows, err = dbc.Rows()
    if err != nil {
       golog.Error(err)
       return records, err
    }

    defer func() {
       rows.Close()
    }()
    for rows.Next() {
       dbentity = clone.Clone(dbentity) //    dbentity := reflect.New(dbtableType).Elem()
       if err := dbc.ScanRows(rows, dbentity); err != nil {
          golog.Error("should get no error, but got ", err)
          return records, err
       }
       records = append(records, dbentity)
    }

    return baseutils.ParseArray2Map(records)

}
func (self *PagedbRequest) FindScanTable() *gorm.DB {

    dbc := self.GetDB().Table(self.TableName)

    dbc = self.BuildWhere(dbc)
    dbc = self.Order(dbc)
    dbc = self.SetLimit(dbc)
    if self.FieldsName != "" {
       dbc = dbc.Select(strings.Split(self.FieldsName, ","))
    }
    return dbc

}
func ParseArray2Map(stru []any) (any, error) {
    var bytes, err = gjson.Encode(stru)
    if err != nil {
       return nil, err
    }
    logrus.Info(1)
    return gjson.Decode(bytes)

}
func (self *PageRequest) CountTable(table string) (int, error) {
    dbc := self.GetDB().Table(table)
    dbc = self.BuildWhere(dbc).Offset(0).Limit(1)
    var count int
    if err := dbc.Count(&count).Error; err != nil {
       logrus.Error(err)
       return 0, err
    }

    logrus.Info("\ncount=", count)
    return count, nil

}

标签:return,err,StructField,self,reflect,var,dbc,go,gorm
From: https://blog.csdn.net/leijmdas/article/details/142895235

相关文章

  • 基于django+vue+Vue火车票预售系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和人民生活水平的不断提高,铁路出行已成为人们日常生活中不可或缺的交通方式。传统的火车票购买方式,如排队购票或通......
  • 基于django+vue+Vue火车票订票系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和人民生活水平的不断提高,铁路出行已成为人们日常生活中不可或缺的交通方式之一。传统的火车票购买方式,如排队购票......
  • 基于django+vue+Vue皓缘服装厂员工管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着服装行业的快速发展,企业管理面临越来越多的挑战,尤其是人力资源管理方面。皓缘服装厂作为一家具有一定规模的服装制造企业,在日常运营中......
  • 基于django+vue+Vue基于“互联网+”的智慧药房管理系统【开题报告+程序+论文】-计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着医疗技术的不断进步和人们对健康需求的日益增长,医院药房的管理效率和服务质量成为了医疗体系中不可或缺的一环。传统药房管理模式依赖......
  • 基于django+vue+Vue基于+Mybatis的医生在线诊所平台【开题报告+程序+论文】-计算机毕
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,医疗行业也迎来了数字化转型的浪潮。传统的就医模式面临着诸多挑战,如医疗资源分配不均、患者就医体验不佳、医生......
  • 基于django+vue+Vue花店销售系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着人们生活水平的提高和消费观念的转变,鲜花作为一种传递情感、美化生活的特殊商品,其市场需求日益旺盛。传统的花店销售模式往往依赖于线......
  • 基于django+vue+Vue户籍管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景户籍管理作为国家行政管理的重要组成部分,是维护社会稳定、促进人口合理流动和保障公民权益的基础性工作。随着信息技术的飞速发展,传统的户......
  • 基于django+vue+Vue湖南特色农产品销售系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景湖南,作为中国的一个农业大省,拥有丰富的特色农产品资源,如湘莲、临武鸭、安化黑茶等,这些农产品不仅品质上乘,而且承载着湖南深厚的文化底蕴。......
  • 基于django+vue+Vue红枫超市会员管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着市场经济的快速发展和消费者需求的多样化,超市作为零售业的重要组成部分,面临着日益激烈的竞争。红枫超市作为一家在当地具有良好口碑的......
  • 基于django+vue+Vue贺州图特产管理系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景贺州,作为广西壮族自治区的一颗璀璨明珠,拥有丰富的自然资源和深厚的文化底蕴,孕育了众多独具特色的地方特产。随着电子商务的蓬勃发展和消费......