go gorm StructField动态天生结构体查询多条表记录 开辟者神器、DB通用微服 ...

打印 上一主题 下一主题

主题 1788|帖子 1788|积分 5364

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
water/goweb
  1. type PagedbRequest struct {
  2.     page.PageRequest
  3.     //表名
  4.     TableName string `json:"table_name"`
  5.     //字段列表,分隔
  6.     FieldsName string `json:"fields_name"`
  7.     //返回日期转为int64
  8.     TimeToInt  bool `json:"time_to_int"`
  9.     Camel2Case bool `json:"-"`
  10.     SubTable  *SubTableDto `json:"sub_table,omitempty"`
  11.     JoinTable *SubTableDto `json:"join_table,omitempty"`
  12. }
复制代码
  1. type PageRequest struct {
  2.     basedto.BaseEntity `json:"-"`
  3.     RequestId          string `json:"request_id"`
  4.     //每页记录数
  5.     PageSize int `json:"page_size"`
  6.     //当前页码
  7.     PageCurrent int `json:"current"`
  8.     //排序字段数组
  9.     OrderBys []*dto.OrderByDto `json:"order_by"`
  10.     //查询字段条件
  11.     Fields     []*dto.QueryField `json:"fields"`
  12.     EsBoolType int               `json:"es_bool_type"`
  13.     *baseconfig.DbClientDto `json:"-"`
  14. }
复制代码
  1. type PageResult struct {
  2.     basedto.BaseEntity
  3.     Code int    `json:"code"`
  4.     Msg  string `json:"msg"`
  5.     PageSize    int `json:"page_size,omitempty"`
  6.     PageCurrent int `json:"current,omitempty"`
  7.     Total         int             `json:"total,omitempty"`
  8.     Data          any             `json:"data"`
  9.    
  10. }
  11. 测试用例
复制代码
  1. func Test013_GeneralScanTable(t *testing.T) {
  2.     var dbRequest = Default().SetPageSize(3)
  3.     dbRequest.TableName = "sys_dept"
  4.     dbRequest.FieldsName = "dept_id,dept_name" //dbRequest.SetQueryAll(true)
  5.     var result = dbRequest.GeneralScanTable()
  6.     golog.Info(result)
  7. }
复制代码
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": "长沙分公司"
          }
     ],
  
}

代码实现
  1. package pagedb
  2. import (
  3.     "errors"
  4.     "gitee.com/leijmdas/gobase/goconfig/common/base/basedto"
  5.     "gitee.com/leijmdas/gobase/goconfig/common/base/baseutils"
  6.     "gitee.com/leijmdas/gobase/goconfig/common/base/jsonutils"
  7.     "gitee.com/leijmdas/gobase/goconfig/common/base/stringutils"
  8.     "gitee.com/leijmdas/gobase/goconfig/common/gocontext"
  9.     "gitee.com/leijmdas/gobase/goconfig/common/golog"
  10.     "gitee.com/leijmdas/gobase/goconfig/common/ichubconfig"
  11.     "gitee.com/leijmdas/goweb/common/meta/metadata"
  12.     "gitee.com/leijmdas/goweb/common/meta/service"
  13.     "gitee.com/leijmdas/goweb/commonpage/page"
  14.     "github.com/huandu/go-clone"
  15.     "github.com/jinzhu/gorm"
  16.     "reflect"
  17.     "time"
  18.     "github.com/sirupsen/logrus"
  19.     "strings"
  20. )
复制代码
  1. func (self *PagedbRequest) GeneralScanTable() *page.PageResult {
  2.     var metadataFactroy = service.FindBeanMetadataFactroy() //(self.DbClientDto)
  3.     var metadata = metadataFactroy.FindMetadata(self.TableName)
  4.     if !metadata.TableExist {
  5.        return page.ResultFailedPageResultErr(errors.New("table not exist"))
  6.     }
  7.     var dbentity = self.CreateDbTableStru(metadata)
  8.     var records, err = self.ScanTable(dbentity.Addr().Interface())
  9.     if err != nil {
  10.        return page.ResultFailedPageResultErr(err)
  11.     }
  12.     var result = page.DefaultResult()
  13.     result.PageCurrent = self.PageCurrent
  14.     result.PageSize = self.PageSize
  15.     result.Total, _ = self.CountTable(self.TableName)
  16.     result.Data = records
  17.     return result
  18. }
复制代码
  1. func (self *PagedbRequest) CreateDbTableStru(meta *metadata.MetadataTable) reflect.Value {
  2.     // logrus.Info("CreateDbTableStru meta=", meta.ToPrettyString())
  3.     var metaColService = service.NewMetadataFactroy()
  4.     dbFields := []reflect.StructField{}
  5.     for _, col := range meta.Columns {
  6.        //logrus.Info("CreateDbTableStru col=", col.ToPrettyString())
  7.        var colType = metaColService.FindGoType(col.DataType)
  8.        var ColTyp8 = reflect.TypeOf(int8(0))
  9.        var ct = func(colType string) *reflect.Type {
  10.           var ColTyp = reflect.TypeOf(int8(0))
  11.           switch colType {
  12.           case "float64":
  13.              ColTyp = reflect.TypeOf(float64(0))
  14.           case "int64":
  15.              ColTyp = reflect.TypeOf(int64(0))
  16.           case "int32":
  17.              ColTyp = reflect.TypeOf(int64(0))
  18.           case "string":
  19.              ColTyp = reflect.TypeOf("")
  20.           case "bool":
  21.              ColTyp = reflect.TypeOf(true)
  22.           case "byte":
  23.              ColTyp = reflect.TypeOf(byte(0))
  24.           case "[]byte":
  25.              ColTyp = reflect.TypeOf([]byte{})
  26.           case "time.Time":
  27.              ColTyp = reflect.TypeOf(time.Now())
  28.           }
  29.           return &ColTyp
  30.        }(colType)
  31.        if ColTyp8 != *ct {
  32.           var colField = reflect.StructField{
  33.              Name: stringutils.Case2Camel(col.ColumnName),
  34.              Type: *ct,
  35.           }
  36.           if self.IfExistField(col.ColumnName) {
  37.              //colField.Tag = reflect.StructTag(fmt.Sprintf("json:"%s"", col.ColumnName))
  38.              dbFields = append(dbFields, colField)
  39.           }
  40.        }
  41.     }
  42.     dbtableType := reflect.StructOf(dbFields)
  43.     dbentity := reflect.New(dbtableType).Elem()
  44.     return dbentity
  45. }
复制代码
  1. func (self *PagedbRequest) IfExistField(field string) bool {
  2.     if self.FieldsName == "" {
  3.        return true
  4.     }
  5.     if strings.Contains(field, ",") {
  6.        return false
  7.     }
  8.     var fields = strings.Split(self.FieldsName, ",")
  9.     for _, v := range fields {
  10.        if v == field {
  11.           return true
  12.        }
  13.     }
  14.     return false
  15. }
复制代码
  1. func (self *PagedbRequest) ScanTable(dbentity any) (any, error) {
  2.     var records = []any{} //reflect.New(reflect.SliceOf(dbtableType)).Elem()
  3.     var dbc = self.FindScanTable()
  4.     var rows, err = dbc.Rows()
  5.     if err != nil {
  6.        golog.Error(err)
  7.        return records, err
  8.     }
  9.     defer func() {
  10.        rows.Close()
  11.     }()
  12.     for rows.Next() {
  13.        dbentity = clone.Clone(dbentity) //    dbentity := reflect.New(dbtableType).Elem()
  14.        if err := dbc.ScanRows(rows, dbentity); err != nil {
  15.           golog.Error("should get no error, but got ", err)
  16.           return records, err
  17.        }
  18.        records = append(records, dbentity)
  19.     }
  20.     return baseutils.ParseArray2Map(records)
  21. }
复制代码
  1. func (self *PagedbRequest) FindScanTable() *gorm.DB {
  2.     dbc := self.GetDB().Table(self.TableName)
  3.     dbc = self.BuildWhere(dbc)
  4.     dbc = self.Order(dbc)
  5.     dbc = self.SetLimit(dbc)
  6.     if self.FieldsName != "" {
  7.        dbc = dbc.Select(strings.Split(self.FieldsName, ","))
  8.     }
  9.     return dbc
  10. }
复制代码
  1. func ParseArray2Map(stru []any) (any, error) {
  2.     var bytes, err = gjson.Encode(stru)
  3.     if err != nil {
  4.        return nil, err
  5.     }
  6.     logrus.Info(1)
  7.     return gjson.Decode(bytes)
  8. }
复制代码
  1. func (self *PageRequest) CountTable(table string) (int, error) {
  2.     dbc := self.GetDB().Table(table)
  3.     dbc = self.BuildWhere(dbc).Offset(0).Limit(1)
  4.     var count int
  5.     if err := dbc.Count(&count).Error; err != nil {
  6.        logrus.Error(err)
  7.        return 0, err
  8.     }
  9.     logrus.Info("\ncount=", count)
  10.     return count, nil
  11. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曹旭辉

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表