news 2026/5/22 17:05:18

go DbJoinSimple简单封装

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go DbJoinSimple简单封装
本文介绍了一个Go语言实现的数据库查询构建器DbJoinSimple,主要用于简化复杂SQL查询的构建过程。该工具支持链式调用,提供表连接(JOIN/INNER JOIN)、条件筛选(WHERE)、排序(ORDER BY)和分页(LIMIT/OFFSET)等功能。核心结构包括SimpleQuery(查询条件)、SimplePageSize(分页参数)和SimpleOrders(排序参数)。通过With*方法链式构建查询,最终通过WithDb方法生成GORM查询对象。测试用例展示了如何使用该工具进行用户表。。。 https://gitee.com/gowebframe3/webframe.githttps://gitee.com/gowebframe3/webframe/blob/master/gomini/gotool/dbjoinsimple/db_join_simple_test.go DbJoinSimple
package dbjoindto import ( "github.com/samber/lo" ) func DefaultPageSize() *SimplePageSize { return &defaultPageSize } type SimpleQuery struct { Query string Param []any } type SimplePageSize struct { PageSize int `json:"pageSize"` PageCurrent int `json:"pageCurrent"` } type SimpleOrders struct { OrderBy string `json:"orderBy"` IfAsc bool `json:"ifAsc"` } var defaultPageSize = SimplePageSize{ PageSize: 10, PageCurrent: 1, } func (self SimpleOrders) ToOrder() string { return self.OrderBy + " " + (lo.Ternary(self.IfAsc, "asc", "desc")) } func (self SimplePageSize) Default() SimplePageSize { return self }
package dbjoindto type Users struct { Id int `json:"id,string"` Name string `json:"name"` Rating int64 `json:"rating"` } func newUsers() *Users { return &Users{} }

DbJoinSimple

package dbjoinsimple import ( "strings" "gitea.super-study.com/ys-study/gotrain/beapi/data/code/dbjoinsimple/dbjoindto" "gitea.super-study.com/ys-study/gotrain/beapi/database" "gitee.com/gowebframe3/webframe.git/goconfig/base/basedto" "gitee.com/gowebframe3/webframe.git/goconfig/base/basemodel" "gitee.com/gowebframe3/webframe.git/goconfig/ichublog/golog" "gorm.io/gorm" ) type DbJoinSimple struct { basedto.BaseEntity TableName string `json:"tableName"` Select string `json:"select"` Joins []dbjoindto.SimpleQuery InnerJoins []dbjoindto.SimpleQuery Where []dbjoindto.SimpleQuery Orders []dbjoindto.SimpleOrders PageSize *dbjoindto.SimplePageSize } func NewDbJoinSimple() *DbJoinSimple { return &DbJoinSimple{ Select: "*", Where: []dbjoindto.SimpleQuery{}, InnerJoins: []dbjoindto.SimpleQuery{}, Joins: []dbjoindto.SimpleQuery{}, Orders: []dbjoindto.SimpleOrders{}, } } func (self *DbJoinSimple) WithOrder(orderByField string, IfAsc bool) *DbJoinSimple { self.Orders = append(self.Orders, dbjoindto.SimpleOrders{ OrderBy: orderByField, IfAsc: IfAsc, }) return self } func (self *DbJoinSimple) WithPageSize(current, size int) *DbJoinSimple { self.PageSize = &dbjoindto.SimplePageSize{ PageSize: size, PageCurrent: current, } return self } func (self *DbJoinSimple) WithTable(tableName string) *DbJoinSimple { self.TableName = tableName return self } func (self *DbJoinSimple) WithSelect(fs string) *DbJoinSimple { self.Select = fs return self } func (self *DbJoinSimple) WithJoins(query string, args ...any) *DbJoinSimple { self.Joins = append(self.Joins, dbjoindto.SimpleQuery{query, args}) return self } func (self *DbJoinSimple) WithInnerJoins(query string, args ...any) *DbJoinSimple { self.InnerJoins = append(self.InnerJoins, dbjoindto.SimpleQuery{query, args}) return self } func (self *DbJoinSimple) WithWhere(query string, args ...any) *DbJoinSimple { self.Where = append(self.Where, dbjoindto.SimpleQuery{query, args}) return self } func (self *DbJoinSimple) WithDb(db *gorm.DB) *gorm.DB { db = db.Table(self.TableName).Select(self.Select) for i := 0; i < len(self.InnerJoins); i++ { db = db.InnerJoins(self.InnerJoins[i].Query) } for i := 0; i < len(self.Joins); i++ { db = db.Joins(self.Joins[i].Query) } for i := 0; i < len(self.Where); i++ { db = db.Where(self.Where[i].Query, self.Where[i].Param...) } for i := 0; i < len(self.Orders); i++ { db = db.Order(self.Orders[i].ToOrder()) } if self.PageSize != nil { db = db.Limit(self.PageSize.PageSize).Offset((self.PageSize.PageCurrent - 1) * self.PageSize.PageSize) } return db } func (self *DbJoinSimple) DbScanJoin(models any) *gorm.DB { if self.PageSize == nil { self.PageSize = dbjoindto.DefaultPageSize() } var db = self.WithDb(database.GetDb()) var orderBy = strings.Split(self.Select, ",") return db.Order(orderBy[0]).Scan(models) } func (self *DbJoinSimple) QueryJoin() { var jt DbJoinSimple var users []*dbjoindto.Users var db = jt.WithTable("users"). WithSelect("users.name,users.id"). WithInnerJoins("join user_credits on users.id = user_credits.user_id"). WithPageSize(1, 3). WithOrder("users.id", true). WithWhere("users.id >= ?", 1).DbScanJoin(&users) golog.Info(basemodel.AdapterFrom(users), db.Error) }

test

package dbjoinsimple import ( "testing" "time" "gitea.super-study.com/ys-study/gotrain/beapi/database" "gitea.super-study.com/ys-study/gotrain/beapi/db/dbdao/plandao" "gitea.super-study.com/ys-study/gotrain/beapi/db/dbdao/userdao" "gitea.super-study.com/ys-study/gotrain/beapi/db/dbentity/userentity" "gitea.super-study.com/ys-study/gotrain/beapi/gotool/dbframe/dbaudit/simplemodel" "gitee.com/gowebframe3/webframe.git/goconfig/base/basedto" "gitee.com/gowebframe3/webframe.git/goconfig/base/basemodel" "gitee.com/gowebframe3/webframe.git/goconfig/ichublog/golog" "gitee.com/gowebframe3/webframe.git/goweb/mapper" "github.com/stretchr/testify/suite" ) type TestDbSingleSuite struct { suite.Suite } func (self *TestDbSingleSuite) SetupSuite() { //code.InitDb() } func (self *TestDbSingleSuite) SetupTest() { } func TestDbSingleSuites(t *testing.T) { suite.Run(t, new(TestDbSingleSuite)) } type user struct { basedto.BaseEntity Id int `json:"id,string"` Name string `json:"name"` Rating int64 `json:"rating"` } func (self *TestDbSingleSuite) Test001_QueryModel2UserJoin() { var jt DbJoinSimple var users []*user var db = jt.WithTable("users"). WithSelect("users.name,users.id"). WithInnerJoins("join user_credits on users.id = user_credits.user_id"). WithPageSize(1, 3). WithOrder("users.id", true). WithWhere("users.id >= ?", 1).DbScanJoin(&users) golog.Info(basemodel.AdapterFrom(users), db.Error) }

package dbjoinsimple import ( "gitee.com/gowebframe3/webframe.git/goconfig/base/baseiface" "gitee.com/gowebframe3/webframe.git/goconfig/basedi" "github.com/sirupsen/logrus" ) /* @Title 文件名称: db_join_simple_init.go @Desp 描述: 依赖自动注入 @Company 公司: www.learn.com @Author 作者: raymond@163.com 时间: 2026-05-22 16:17:15 @Update 作者: raymond@163.com 时间: 2026-05-22 16:17:15 */ var singleNameDbJoinSimple = "*dbjoin.DbJoinSimple-41b7f4e9-db17-43d2-83c7-ffe493a27088" // init register load func init() { registerBeanDbJoinSimple() } // register DbJoinSimple func registerBeanDbJoinSimple() { err := basedi.RegisterLoadBean(singleNameDbJoinSimple, LoadDbJoinSimple) if err != nil { logrus.Error("register bean error!", err) } } // FindBeanDbJoinSimple func FindBeanDbJoinSimple() *DbJoinSimple { if bean, ok := basedi.FindBeanOk(singleNameDbJoinSimple); ok { return bean.(*DbJoinSimple) } logrus.Error("not find bean!") return nil } func LoadDbJoinSimple() baseiface.ISingleton { var inst = NewDbJoinSimple() InjectDbJoinSimple(inst) return inst } func InjectDbJoinSimple(s *DbJoinSimple) { // s.Init() }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/22 17:04:40

LangChain评估实战:DeepEval智能监控与性能优化完整指南

LangChain评估实战&#xff1a;DeepEval智能监控与性能优化完整指南 【免费下载链接】deepeval The LLM Evaluation Framework 项目地址: https://gitcode.com/GitHub_Trending/de/deepeval 在当今AI应用开发中&#xff0c;LangChain已成为构建复杂LLM工作流的事实标准&…

作者头像 李华
网站建设 2026/5/22 17:02:21

2026降AI工具怎么选?高通过率实用选购指南

一、基础认知&#xff1a;论文降AI工具核心解析 1、论文降AI工具是什么&#xff1f; 论文降AI工具是专门针对学术场景AI痕迹优化的专业工具&#xff0c;依托自研NLP语义算法、深度文本重构技术&#xff0c;对大模型生成内容的句式特征、逻辑规律、词汇范式进行智能化改写优化。…

作者头像 李华
网站建设 2026/5/22 16:56:08

Go语言代码生成:Protobuf生成

Go语言代码生成&#xff1a;Protobuf生成 1. protoc使用 protoc --go_out. --go-grpc_out. *.proto2. 总结 Protobuf代码生成是gRPC开发的标准流程。

作者头像 李华
网站建设 2026/5/22 16:51:29

OpenMTP:macOS上最强大的免费Android文件传输终极指南

OpenMTP&#xff1a;macOS上最强大的免费Android文件传输终极指南 【免费下载链接】openmtp OpenMTP - Advanced Android File Transfer Application for macOS 项目地址: https://gitcode.com/gh_mirrors/op/openmtp 还在为macOS和Android设备之间的文件传输而烦恼吗&a…

作者头像 李华
网站建设 2026/5/22 16:50:42

代码质量与代码审查

代码质量与代码审查 1. 技术分析 1.1 代码质量概述 代码质量是软件维护的关键&#xff1a; 代码质量维度可读性: 易于理解可维护性: 易于修改可测试性: 易于测试性能: 运行效率质量指标:圈复杂度代码覆盖率代码重复率1.2 代码审查流程 审查流程提交代码: PR/MR自动检查: CI/CD人…

作者头像 李华