当前位置: 首页 > 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.jsqmd.com/news/942043/

相关文章:

  • imFile下载管理器:5大核心功能打造你的终极下载体验
  • 2026年6月兰州专业可靠的合同纠纷律师优选:李青源律师定制办案,政企医疗纠纷专项法律服务 - 十大排行榜推荐
  • DIY低成本智能传感器盒:集成温湿度、光照与可调焦PIR运动检测
  • 2026年 HC340/590DPD+Z 高强双相镀锌板厂家推荐榜:深冲性能与耐蚀工艺双优品牌精选 - 品牌企业推荐师(官方)
  • SAP EWM实操:从产品到处理单位,两种库存转移的保姆级配置流程
  • 2026长沙钻石回收六强全优对比|添价收双店联动凭专业核心优势领跑市场 - 薛定谔的梨花猫
  • 闲置首饰别乱卖!天津最新回收榜单,内行私藏不亏价 - 合扬奢侈品交易中心
  • CodeT5代码缺陷检测:如何用AI发现潜在bug的终极指南
  • 3分钟解锁加密音乐:打破平台限制,让音乐真正属于你
  • VS2022安装Resharper C++插件踩坑实录:从下载龟速到激活成功的避坑全记录
  • Topit:macOS窗口置顶工具终极指南 - 3步实现高效多任务工作流
  • 多模态大模型如何强化 Agent 场景理解力?非侵入式自动化落地与避坑详解
  • 关联几何视角下的时空叠加:从量子关联涌现到热力学类比
  • STM32F103ZET6上跑的编码电机调速方案:模糊逻辑在线调参+增量式PID闭环
  • 2026年湖南钢模板定制租赁全链条服务商深度横评与选购指南 - 精选优质企业推荐官
  • 终极截图文字识别指南:3分钟掌握Umi-OCR高效操作技巧
  • 2026.6.3面向对象
  • CodeT5社区资源汇总:学习资料、工具和最佳实践
  • PCL2启动器网络异常问题:从快速诊断到彻底修复的终极指南
  • GitHub_Trending/ma/machine-learning-for-trading数据处理教程:从原始数据到交易信号的完整流程
  • Windows系统盘救星:用mklink命令把Oracle数据库从C盘挪走(附详细步骤)
  • AI大模型、Agent、MCP彻底搞懂!从大脑到智能体,底层逻辑全解析,小白也能秒懂!
  • AI 赋能金融场景钓鱼攻击演化、技术解构与全链路风控研究
  • 大连本地黄金回收猫腻不少,完整版避坑手册,选准门店守住变现收益 - 合扬奢侈品交易中心
  • 数据库适配的“最后一公里”:从“能连上”到“跑得稳”
  • 2026年宁夏打包箱与钢结构工程源头工厂选型指南:西北五省厂房冷库一站式解决方案 - 优质企业观察收录
  • 突破3D视觉数据瓶颈:合成数据引擎的创新策略与实践
  • Arduino超声波感应洗手液机DIY:从传感器原理到机械传动全解析
  • BarrageGrab:革新直播弹幕采集工具的终极解决方案
  • 3个关键步骤:彻底解决Windows 11热键冲突问题