当前位置: 首页 > news >正文

一个gorm PageSql封装的进化

开始:

func (self *CoachService) ListCoachesAssign(req *QueryCoachRequest, trialFlag bool) *pagesql.PageResult { if req.PageSize == 0 { req.PageSize = 100 } var pagesql = pagesql.DefaultPageSql[viewdto.CoachVo]() var keywordAnd, sexWhere, phoneWhere, coachIdWhere, userTypeWhere string if req.Keyword != "" { keywordAnd = fmt.Sprintf(` and ( %s ) `, pagesql.KeywordWhere2Or("name,phone,user_no", req.Keyword)) } if req.Param.Sex != nil { sexWhere = fmt.Sprintf(` and sex = %d `, *req.Param.Sex) if *req.Param.Sex == 0 { sexWhere = ` and ( sex = 0 or sex is null ) ` } } if req.Param.Phone != "" { phoneWhere = fmt.Sprintf(` and phone = '%s' `, req.Param.Phone) } if req.Param.CoachId > 0 { phoneWhere = fmt.Sprintf(` and id = %d `, req.Param.CoachId) } userTypeWhere = fmt.Sprintf(` and user_type in (40,42) and opc_id = %d `, req.OpcId) if trialFlag { userTypeWhere = fmt.Sprintf(` and user_type in (41,42) and opc_id = %d `, req.OpcId) } var sql = `select * from users where deleted_at is null and rel_role='C' and is_pause=0 ` + keywordAnd + sexWhere + phoneWhere + coachIdWhere + userTypeWhere + ` and not (id in (select distinct coach_id from train_plan tp where status in (-1,0,1) and coach_id is not null and startd_at > ? and (startd_at between ? and ? or end_at between ? and ?) limit 2000))` var start = ctxt.FindBeanCoachContext().CoachIntervalBefore(req.Param.PlanStart) var end = ctxt.FindBeanCoachContext().CoachIntervalAfter(req.Param.PlanEnd) pagesql.SetLimit(req.PageSize) pagesql.AppendSql(sql) var args = []any{time.Now(), start, end, start, end} golog.Stat("sql:", pagesql.Sql, args) return pagesql.Scan2PageResultIf(false, args...) }

演化:

func (self *FacadeFsrs) QueryModelPersonPlanWordCards(req *facadedto.FsrsCardsRequest) *pagemodel.PageResult[*fsrsentity.FsrsCards] { if req.VocabID == 0 { if ret := userservice.FindBeanUserService().FindByIdAtCache(req.StudentId); ret.ExistRecord() { req.VocabID = ret.Data.VocabId } } if len(req.Filtered) == 0 { req.Filtered = []int64{0} } var where = ` WHERE fsrs_cards.user_id = %d AND fsrs_cards.obj_id IN (SELECT json_array_elements_text(meta->'items')::int FROM plan_personal WHERE plan_personal.user_id = %d AND plan_personal.type = 'formal' AND plan_personal.scope_id = %d ) AND fsrs_cards.obj_id NOT IN (%s) ` where = fmt.Sprintf(where, req.StudentId, req.StudentId, req.VocabID, strings.Join(gconv.SliceStr(req.Filtered), ",")) var countSql = `select COUNT(1) count FROM fsrs_cards ` + where var sql = `select fsrs_cards.* FROM fsrs_cards ` + where + ` order by fsrs_status(state),due ` var dao = daosingle.FindBeanDaoSingle().FsrsCardsDao.DefaultDao() dao.PageSize = req.PageSize dao.PageCurrent = req.PageCurrent var rets = dao.DbSelectPageResult(sql) if ret := daosingle.FindBeanDaoSingle().FsrsCardsDao.DbSelectCount(countSql); ret.IsSuccess() { rets.Total = gconv.Int(ret.Data) } else { rets.PageFail(ret.Msg) } return rets }

进化:

func (self *FacadeFsrs) QueryModelFsrsCardsSimple(req *FsrsCardsRequest) *page.PageResult { req.FillStudentVcab().Check() var dao = dbjoinsimple.FindBeanDbJoinSimple() dao.WithTabler(fsrsentity.FindBeanFsrsCards()) dao.WithSelect("fsrs_cards.id card_id,reps,obj_id,words.id,words.audio,words.hint,words.word,meaning,ipa,due,word_history_type") dao.WithJoins("join words on fsrs_cards.obj_id = words.id") dao.WithWhere("user_id = ?", req.StudentId) dao.WithWhere("ctype=?", "words") if req.TrainPlanId > 0 { dao.WithWhere("obj_id not in (select word_id from train_words where train_plan_id = ? and if_review = true) ", req.TrainPlanId) } dao.WithWhere(`obj_id IN (SELECT json_array_elements_text(meta->'items')::int FROM plan_personal WHERE plan_personal.user_id = ? AND plan_personal.type = 'formal' AND plan_personal.scope_id = ? ) `, req.StudentId, req.VocabID) if req.WordHistoryType > 0 { dao.WithWhere("word_history_type =?", req.WordHistoryType) } if req.Ipa != "" { dao.WithWhere("word_history_type =?", req.Ipa) } if req.Meaning != "" { dao.WithWhere("meaning like ?", req.Meaning) } if req.Word != "" { dao.WithWhere("word like ?", req.Word) } if req.Reps != nil && len(req.Reps) > 1 { dao.WithWhere("reps between ? and ? ", req.Reps[0], req.Reps[1]) } dao.WithOrder("fsrs_status(state)", true) dao.WithOrder("due", true) dao.WithPageSize(req.PageCurrent, req.PageSize) return dao.DbQueryJoin2Page(&[]*FsrsCards{}) }这篇文章展示了Go语言中数据库查询方法的演进历程: 初始版本使用原生SQL拼接方式构建查询,包含大量条件判断和字符串拼接,处理教练服务相关查询。 演化版本改进为使用预定义SQL模板和参数化查询,增强了词汇学习计划相关的卡片查询功能,包含分页处理和结果统计。 进化版本采用更结构化的构建器模式(dao模式),通过链式调用设置查询条件、连接表和排序规则,实现了更清晰、更模块化的单词卡片查询功能。 这三个版本体现了从原始SQL到ORM风格的转变,代码可读性和可维护性逐步提升,同时保持了查询的灵活性。
http://www.gsyq.cn/news/1453464.html

相关文章:

  • 2026年 HC340/590DPD+Z 高强双相镀锌板厂家推荐榜:深冲性能与耐蚀工艺双优品牌精选 - 品牌企业推荐师(官方)
  • 闲置首饰别乱卖!天津最新回收榜单,内行私藏不亏价 - 合扬奢侈品交易中心
  • STM32F103ZET6上跑的编码电机调速方案:模糊逻辑在线调参+增量式PID闭环
  • Windows系统盘救星:用mklink命令把Oracle数据库从C盘挪走(附详细步骤)
  • AI大模型、Agent、MCP彻底搞懂!从大脑到智能体,底层逻辑全解析,小白也能秒懂!
  • AI 赋能金融场景钓鱼攻击演化、技术解构与全链路风控研究
  • 大连本地黄金回收猫腻不少,完整版避坑手册,选准门店守住变现收益 - 合扬奢侈品交易中心
  • Arduino超声波感应洗手液机DIY:从传感器原理到机械传动全解析
  • 3个关键步骤:彻底解决Windows 11热键冲突问题
  • 从论文到实践:Distill-Any-Depth-Large-hf单目深度估计核心技术原理解析 [特殊字符]
  • 2026深圳工商注册公司口碑排行推荐 5家直营机构实测对比哪家好 - 奔跑123
  • 21个开箱即用的WPF主题文件,WhistlerBlue/RainierRadialBlue等已修复兼容问题
  • 2026年国庆灯会:解读行业三大核心趋势 - 资讯纵览
  • 在线去水印工具有哪些?2026实测这四款工具最能打 - 科技热点发布
  • 王伯吉巧斗母猪龙
  • starlette笔记、和fastapi的区别
  • 2026年环氧树脂胶厂家实力测评:口碑推荐榜与选型指南 - 资讯速览
  • 为什么供应商入驻政采服务平台总选错?5项原因拆解 - 资讯速览
  • 从Fusion360设计到CNC加工:DIY层叠式2.1声道音箱全流程实战
  • 高效多屏工作空间实战指南:Windows虚拟显示器深度解析
  • 终极指南:如何用OpenCore Legacy Patcher让老旧Mac重获新生并优化电池续航
  • MBF v2.0开发预览版深度解析:.NET生物信息学库架构重构与性能优化
  • 用SAM做图像分割?先搞懂点、框、掩码提示该怎么选(附使用场景建议)
  • TMSpeech:3倍效率提升的Windows实时语音转文字解决方案
  • 2026南宁黄金回收实测|5家正规门店深度对比!透明报价零套路变现攻略 - 奢侈品回收测评
  • UE5.1 C++开发第一步:保姆级VS2022社区版安装与必备组件勾选指南
  • 从标注到训练:手把手教你用EISeg+PaddleSeg打造自己的图像分割模型(附避坑指南)
  • 专升本汉语言文学资料|2026古代文学现代文学真题PDF电子版
  • 专升本医学综合资料|2026解剖生理病理药理真题PDF电子版
  • 除了Excel,律所还有什么更好的案件管理方式?三种方案的深度对比