首页 > 其他分享 >go 通过泛型实现通用的增删改查

go 通过泛型实现通用的增删改查

时间:2024-08-08 14:27:12浏览次数:10  
标签:Info err logrus 改查 var go result 泛型 id

接口

type IpagedbRequestModel[T any] interface {
    Insert(entity *T) error
    Update(entity *T) error
    Insert2Result(entity *T) *pagemodel.IchubResult[T]
    Update2Result(entity *T) *pagemodel.IchubResult[T]
    DeleteById(id int64, keys ...string) *pagemodel.IchubResult[T]
    DeleteByIdOf(id int64, model *T, keys ...string) *pagemodel.IchubResult[T]
    FindById(id int64, keys ...string) *pagemodel.IchubResult[T]
    FindByIds(ids string, key ...string) *pagemodel.PageResult[T]
    GeneralQuery() *pagemodel.PageResult[T]
}

实现
package pagedb

import (
    "git.ichub.com/general/webcli120/goconfig/base/basedto"
    "git.ichub.com/general/webcli120/goconfig/base/goutils"
    "git.ichub.com/general/webcli120/goconfig/base/jsonutils"
    "git.ichub.com/general/webcli120/goweb/pagemodel"
    "github.com/gogf/gf/v2/util/gconv"
    "github.com/sirupsen/logrus"
    "strings"
)

type PagedbRequestModel[T any] struct {
    basedto.BaseEntity
    *PageDbRequest
}

func DefaultModel[T any]() *PagedbRequestModel[T] {
    return NewPagedbRequestModel[T]()
}

func NewPagedbRequestModel[T any]() *PagedbRequestModel[T] {
    var model = &PagedbRequestModel[T]{
       PageDbRequest: Default(),
    }
    model.InitProxy(model)
    return model
}

func (self *PagedbRequestModel[T]) GeneralQuery() *pagemodel.PageResult[T] {
    var resultModel = pagemodel.DefaultResult[T]()
    var result = self.PageDbRequest.GeneralQuery()
    if result.IsSuccess() && result.Data != nil {
       var models = make([]T, 0)
       var bytes, err = jsonutils.ToJsonBytes(result.Data)
       if err != nil {
          goutils.Error(err)
          return resultModel
       }
       jsonutils.FromJsonByte(bytes, &models)
       result.Data = models
       resultModel.Data = models
    }

    return resultModel
}
func (self *PagedbRequestModel[T]) FindById(id int64, keys ...string) *pagemodel.IchubResult[T] {
    self.PageDbRequest.Eq("id", id)
    var result = self.GeneralQuery()

    var res = pagemodel.NewIchubResult[T]()
    res.Code = result.Code
    res.Msg = result.Msg
    if res.IsSuccess() && result.Data != nil && len(result.Data) > 0 {
       res.Data = result.Data[0]
       res.Total = 1
    }

    return res

}
func (self *PagedbRequestModel[T]) DeleteById(id int64, keys ...string) *pagemodel.IchubResult[T] {
    var db = self.GetDB()
    if self.TableName != "" {
       db = db.Table(self.TableName)
    }
    //db.Delete("id",id)
    var entity map[string]any = make(map[string]any, 0)
    err := db.Where("id=?", id).Delete(&entity).Error
    var res = pagemodel.NewIchubResult[T]()
    if err != nil {
       logrus.Error(err.Error())
       res.FailMsg(err.Error())
    }
    return res

}
func (self *PagedbRequestModel[T]) DeleteByIdOf(id int64, model *T, keys ...string) *pagemodel.IchubResult[T] {
    var db = self.GetDB()
    if self.TableName != "" {
       db = db.Table(self.TableName)
    }
    //db.Delete("id",id)
    var entity map[string]any = make(map[string]any, 0)
    err := db.Where("id=?", id).Delete(&entity).Error
    var res = pagemodel.NewIchubResult[T]()
    if err != nil {
       logrus.Error(err.Error())
       res.FailMsg(err.Error())
    }
    return res

}
func (self *PagedbRequestModel[T]) FindByIds(ids string, key ...string) *pagemodel.PageResult[T] {
    var idsint = gconv.SliceInt64(strings.Split(ids, ","))
    var params = gconv.SliceAny(idsint)
    self.PageDbRequest.In("id", params)

    var resultModel = pagemodel.DefaultResult[T]()

    var result = self.PageDbRequest.GeneralQuery()
    if result.IsSuccess() && result.Data != nil {
       var models = make([]T, 0)
       var bytes, err = jsonutils.ToJsonBytes(result.Data)
       if err != nil {
          goutils.Error(err)
          return resultModel
       }
       jsonutils.FromJsonByte(bytes, &models)
       result.Data = models
       resultModel.Data = models
    }

    return resultModel
}
func (self *PagedbRequestModel[T]) Insert(entity *T) error {
    var db = self.GetDB()
    if self.TableName != "" {
       db = db.Table(self.TableName)
    }
    err := db.Create(entity).Error
    if err != nil {
       logrus.Println(err.Error())
       return err
    }

    logrus.Info(entity)
    return nil

}
func (self *PagedbRequestModel[T]) Update(entity *T) error {
    var db = self.GetDB()
    if self.TableName != "" {
       db = db.Table(self.TableName)
    }
    err := db.Save(entity).Error
    if err != nil {
       logrus.Println(err.Error())
       return err
    }

    return nil

}

func (self *PagedbRequestModel[T]) Insert2Result(entity *T) *pagemodel.IchubResult[T] {
    var err = self.Insert(entity)
    var result = pagemodel.DefaultIchubResult[T]()
    result.Data = *entity
    if err != nil {
       result.FailMsg(err.Error())
    }
    return result

}
func (self *PagedbRequestModel[T]) Update2Result(entity *T) *pagemodel.IchubResult[T] {
    var err = self.Update(entity)
    var result = pagemodel.DefaultIchubResult[T]()
    result.Data = *entity
    if err != nil {
       result.FailMsg(err.Error())
    }
    return result

}

测试用例
package dao

/*
   @Title  文件名称: TestShopDaoSuite.go
   @Description 描述: 测试服务TestEmployeeDaoSuite

   @Author  作者: [email protected] 时间: 2024-06-29 08:24:24
   @Update  作者: [email protected] 时间: 2024-06-29 08:24:24

*/

import (
    "git.ichub.com/general/webcli120/goconfig/base/basedao"
    "git.ichub.com/general/webcli120/goconfig/base/jsonutils"
    "git.ichub.com/general/webcli120/goweb/pagedb"
    "git.ichub.com/general/webcli120/test/db/dao"
    "git.ichub.com/general/webcli120/test/db/model"
    "github.com/sirupsen/logrus"
    "github.com/stretchr/testify/suite"

    "testing"
    //"time"
)

type TestShopDaoSuite struct {
    suite.Suite
    basedao.BaseDao
    Dao dao.EmployeeDAO
}

func TestShopDaoSuites(t *testing.T) {
    suite.Run(t, new(TestShopDaoSuite))
}

/*
@title     函数名称: Setup
@description      : 测试套前置脚本
@auth      作者: [email protected]
@date      时间: 2024-06-29 08:24:24
@param     输入参数名:        无
@return    返回参数名:        无
*/
func (this *TestShopDaoSuite) SuiteSetupTest() {

    logrus.Info("setUp all tests")
    // mysql postgres cockroach
}

/*
@title           : 测试套后置脚本
@auth      作者: [email protected]
@description 函数名称: Teardown
@date      时间: 2024-06-29 08:24:24
@param     输入参数名:        无
@return    返回参数名:        无
*/
func (this *TestShopDaoSuite) SuiteTearDownTest() {
    logrus.Info("tearDown all tests")
}

/*
@title     函数名称: Save
@description      : 保存接口
@auth      作者    :  [email protected]
@date      时间    :  2024-06-29 08:24:24
@param     输入参数名:  t *testing.T
@return    返回参数名:  无
*/
func (this *TestShopDaoSuite) Save() int32 {
    var entity model.Employee

    this.Dao.Save(&entity)

    return entity.Id
}

/*
@title     函数名称: SaveEntity
@description : 保存接口
@auth      作者    : [email protected]
@date      时间    : 2024-06-29 08:24:24
@param     输入参数名: 无
@return    返回参数名: 无
*/

func (this *TestShopDaoSuite) Test010_QueryShop() {
    logrus.Info("start  Query ...")

    var req = pagedb.Default()
    req.TableName = "contact_shop"
    req.TimeToInt = true

    var result = req.GeneralQuery() //&TableModel{}, []TableModel{})
    logrus.Info(req, result)
    this.Equal(200, result.Code)

}

type GeneralEntity struct {
    Id   int    `json:"id" gorm:"primary_key"`
    Name string `json:"name"`
}

func (this *TestShopDaoSuite) Test011_QueryShopUser() {
    logrus.Info("start  Query ...")

    var req = pagedb.Default()
    req.TableName = "contact_user"
    req.TimeToInt = true

    var result = req.GeneralQuery() //&TableModel{}, []TableModel{})
    logrus.Info(req, result)
    this.Equal(200, result.Code)

}
func (this *TestShopDaoSuite) Test012_QueryAsShopUser() {
    logrus.Info("start  Query User as...")

    var req = pagedb.Default()
    req.PageSize = 2
    req.TableName = "contact_user"
    req.TimeToInt = true

    var result = req.GeneralQuery()
    logrus.Info(req, result)
    this.Equal(200, result.Code)

    var res = pagedb.GeneralQueryAs[GeneralEntity](result)
    logrus.Info(res)
}
func (this *TestShopDaoSuite) Test013_QueryAsModel() {
    logrus.Info("start  Query User as...")

    var req = pagedb.DefaultModel[GeneralEntity]()
    req.PageSize = 2
    req.TableName = "contact_user"
    req.TimeToInt = true

    var result = req.GeneralQuery()
    logrus.Info(req, result)
    this.Equal(200, result.Code)

}
func (this *TestShopDaoSuite) Test014_QueryModelShopMember() {
    logrus.Info("start  Query User as...")

    var defaultModel = pagedb.DefaultModel[GeneralEntity]()
    defaultModel.PageSize = 2
    defaultModel.TableName = "contact_shop_member"
    defaultModel.TimeToInt = true

    var result = defaultModel.GeneralQuery()
    logrus.Info(defaultModel)
    this.Equal(200, result.Code)
    logrus.Info(result)

}
func (this *TestShopDaoSuite) Test015_FindByIdShopMember() {
    logrus.Info("start  Query User as...")

    var defaultModel = pagedb.DefaultModel[GeneralEntity]()
    defaultModel.PageSize = 2
    defaultModel.TableName = "contact_shop_member"
    defaultModel.TimeToInt = true
    //722622553218875393
    var result = defaultModel.FindById(722622553218875393)
    logrus.Info(defaultModel)
    this.Equal(200, result.Code)
    logrus.Info(result)

}
func (this *TestShopDaoSuite) Test016_FindByIdsShopMember() {
    logrus.Info("start  Query User as...")

    var defaultModel = pagedb.DefaultModel[GeneralEntity]()
    defaultModel.PageSize = 2
    defaultModel.TableName = "contact_shop_member"
    defaultModel.TimeToInt = true
    //722622553218875393
    var result = defaultModel.FindByIds("722612810728800257,722622553218875393")
    logrus.Info(defaultModel)
    this.Equal(200, result.Code)
    logrus.Info(result)

}
func (this *TestShopDaoSuite) Test017_InsertSave() {
    logrus.Info("start  Query User as...")

    var defaultModel = pagedb.DefaultModel[GeneralEntity]()
    defaultModel.TableName = "contact_shop_member"
    var err = defaultModel.Insert(&GeneralEntity{Name: "leijmdas"})

    logrus.Info(err)
}
func (this *TestShopDaoSuite) Test017_InsertSave2Result() {
    logrus.Info("start  Query User as...")

    var defaultModel = pagedb.DefaultModel[GeneralEntity]()
    defaultModel.TableName = "contact_shop_member"
    var result = defaultModel.Insert2Result(&GeneralEntity{Name: "leijmdas"})

    logrus.Info(jsonutils.ToJsonPretty(result))
}

func (this *TestShopDaoSuite) Test016_DeleteByIdShopMember() {
    logrus.Info("start  Query User as...")

    var defaultModel = pagedb.DefaultModel[GeneralEntity]()
    defaultModel.PageSize = 2
    defaultModel.TableName = "contact_shop_member"
    defaultModel.TimeToInt = true

    var result = defaultModel.DeleteById(992959707715141635)
    logrus.Info(defaultModel)
    this.Equal(200, result.Code)
    logrus.Info(jsonutils.ToJsonPretty(result))

}

测试结果
func (this *TestShopDaoSuite) Test013_QueryAsModel() {
    logrus.Info("start  Query User as...")

    var req = pagedb.DefaultModel[GeneralEntity]()
    req.PageSize = 2
    req.TableName = "contact_user"
    req.TimeToInt = true

    var result = req.GeneralQuery()
    logrus.Info(req, result)
    this.Equal(200, result.Code)

}

INFO[2024-08-88 14:23:12]D:/go-ichub/git.ichub.com/webcli120/test/db/test/dao/shop_dao_test.go:140 git.ichub.com/general/webcli120/test/db/test/dao.(*TestShopDaoSuite).Test013_QueryAsModel() {
     "page_size": 2,
     "current": 1,
     "order_by": null,
     "fields": null,
     "es_bool_type": 0,
     "table_name": "contact_user",
     "fields_name": "id,created_at,updated_at,deleted_at,contract_id,identities_id,name,avatar,registered_user_name,registered_cellphone,registered_email,language_id,time_zone_id,location_id,about,description,is_inactive,natural_person_id,legal_person_id,invitation_id,is_partner,status,created_by,updated_by,deleted_by,latest_shop_id,slug,short_name,partnered_user_id,last_login_at,rowid,id_10,partner_id_10,version_10,latest_account_id,shop_count,station,sound_switch,wechat_nickname,wx_nickname",
     "time_to_int": true
} {
     "code": 200,
     "msg": "成功",
     "data": [
          {
               "id": 722612810136944641,
               "name": "万强"
          },
          {
               "id": 722622552618205185,
               "name": "杨旭"
          }
     ]

标签:Info,err,logrus,改查,var,go,result,泛型,id
From: https://blog.csdn.net/leijmdas/article/details/141025875

相关文章

  • LangChain与泛型编程:探索代码生成的新维度
    LangChain与泛型编程:探索代码生成的新维度在软件开发领域,泛型编程是一种允许创建可重用组件的技术,这些组件可以在多种数据类型上工作的编程范式。LangChain作为一个假设的编程辅助工具,如果存在,它可能会支持泛型编程,以增强其代码生成的能力。本文将探讨LangChain对泛型编程......
  • 计算机毕业设计django+vue好生活线上超市购物系统的设计与实现【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展,电子商务已成为人们日常生活中不可或缺的一部分,特别是线上超市购物平台的兴起,极大地便利了消费者的购物体验。然......
  • 如何把Connection 封装到工具类里面 调用工具类方法实现 增删改查操作 java JDBC
    如何把Connection封装到工具类里面调用工具类方法实现增删改查操作javaJDBC使用数据库连接池以HikariCP为例在JDBC中,使用数据库连接池是一个常见的做法,以提高数据库操作的效率和性能。连接池管理着一组数据库连接,这些连接可以被重用而不是每次需要时都创建新的连接。......
  • 如何把Connection 封装到工具类里面 调用工具类方法实现 增删改查操作 java JDBC使用
    如何把Connection封装到工具类里面调用工具类方法实现增删改查操作javaJDBC使用C3P0数据库连接池答:当使用C3P0作为数据库连接池时,你可以按照类似的模式来配置和使用它。以下是一个示例,展示了如何在Java项目中配置C3P0连接池,并创建一个工具类来管理数据库连接和执行基本的......
  • # entos7系统安装稳定版Google浏览器
    首先,执行以下命令以导入Google的签名密钥,这样系统就能验证从Google官方仓库下载的软件包的真实性:Bash1sudorpm--importhttps://dl.google.com/linux/linux_signing_key.pub接着,创建一个新的Yum仓库配置文件/etc/yum.repos.d/google-chrome.repo,内容如下:Bash1sudosh-c......
  • 介绍一款新奇的开源操作系统:GodoOS
    在快节奏的现代办公环境中,一款高效、集成化的操作系统无疑是提升工作效率的利器。今天,我们要为您隆重介绍——GodoOS,一款专为内网办公环境设计的全能操作系统。它不仅仅是一个工具,更是您团队协作与文件管理的得力助手,将彻底改变您的工作方式,带来前所未有的便捷体验! 【全能......
  • 行为类似于基本类型的泛型类型
    我想创建一个泛型类型A[T],其行为与T完全相同,只不过我可以在运行时告诉我该类型实际上是A[T]而不是T我尝试过classA(Generic[T],T):pass但是似乎不起作用,正如mypy抱怨的那样,例如,A[str]的类型为object作......
  • ImportError:无法从“jwt.algorithms”导入名称“RSAAlgorithm”
    RSAAlgorithmPyJWT算法方法无法导入,但我确实安装了PyJWT错误:ImportError:cannotimportname'RSAAlgorithm'from'jwt.algorithms'我通过运行以下命令检查了该包是否可用:poetryshow|grep-ipyjwtpyjwt2.9.0J......
  • SpringIOC整合dbUtil做的增删改查以及转账业务的实现
    目录一、xml方式实现1.介绍lombok插件2.功能3.步骤3.1idea安装插件(只做一次)3.2添加坐标 3.3编写注解4.核心类4.1QueryRunner4.2query()查询4.3update()增删改5.配置文件applicationContext.xml6.junit测试6.1使用步骤6.1.1坐标6.1.2注解(修饰方......
  • Django第一天的学习(之后会更新完Django一套体系)
    前言发了不少关于Django的文章,但关于大多都是小部分,不完全,大概整理一下笔记,之后会争取把Django一套体系写完。今天发表第一天的Django学习笔记。文章目录前言Django框架的介绍Django的安装Django框架开发创建项目的指令Django项目的目录结构URL介绍视图函数(view)D......