改进代码 var req Total rows, err := common.DB.Raw("SELECT * FROM flaws WHERE facility_id = ? "+ "UNION SELECT * FROM issues WHERE facility_id = ? "+ "UNION SELECT * FROM records WHERE facility_id = ? "+ "UNION SELECT * FROM qualities WHERE facility_id = ? "+ "UNION SELECT * FROM inspections WHERE facility_id = ?", code, code, code, code, code).Rows() if err != nil { resp.Code = 400 resp.Msg = "记录不存在" ctx.JSON(400, resp) return } for rows.Next() { common.DB.ScanRows(rows, &req) } resp.Data = req ctx.JSON(200, resp)

时间: 2024-01-11 19:03:14 浏览: 28
可以改进的地方如下: 1. 可以将查询语句中的 UNION 操作改为 INNER JOIN 操作,这样可以减少查询的时间复杂度。同时,使用 INNER JOIN 还可以避免查询结果中出现重复的记录。 2. 在执行查询语句之前,可以先检查传入的 code 参数是否为空或者是否符合要求,以避免 SQL 注入等安全问题。 3. 可以使用 GORM 等 ORM 工具来简化代码,同时还可以避免一些常见的错误,例如忘记关闭数据库连接等。 改进后的代码如下: ```go if code == "" { resp.Code = 400 resp.Msg = "参数错误" ctx.JSON(400, resp) return } var req Total if err := common.DB. Table("flaws"). Joins("INNER JOIN issues ON flaws.facility_id = issues.facility_id"). Joins("INNER JOIN records ON issues.facility_id = records.facility_id"). Joins("INNER JOIN qualities ON records.facility_id = qualities.facility_id"). Joins("INNER JOIN inspections ON qualities.facility_id = inspections.facility_id"). Where("flaws.facility_id = ?", code). Scan(&req).Error; err != nil { if gorm.IsRecordNotFoundError(err) { resp.Code = 400 resp.Msg = "记录不存在" ctx.JSON(400, resp) return } else { resp.Code = 500 resp.Msg = "服务器错误" ctx.JSON(500, resp) return } } resp.Data = req ctx.JSON(200, resp) ``` 需要注意的是,上述代码只是简单地演示了一种改进的方法,具体的实现方式可能因为框架、数据库等因素而有所不同。

相关推荐

改进代码func TracingList(ctx *gin.Context) { resp := models.Response{ Code: 0, Msg: "success", } t, _ := strconv.Atoi(ctx.Query("t")) label, _ := strconv.Atoi(ctx.Query("label")) page, _ := strconv.Atoi(ctx.DefaultQuery("page", "1")) pageSize, _ := strconv.Atoi(ctx.DefaultQuery("pageSize", "10")) code := ctx.Query("code") //设施类型 if len(code) == 0 { resp.Code = 400 resp.Msg = "请输入code值" ctx.JSON(400, resp) return } type Total struct { gorm.Model Type int16 Source int16 Explanation string Label int16 FacilityID string } db := common.DB.Session(&gorm.Session{}) if t < 0 || t > 5 { var req interface{} switch t { case 0: req = []*Total{} case 1: req = []*models.Flaw{} case 2: req = []*models.Issue{} case 3: req = []*models.Record{} case 4: req = []*models.Quality{} case 5: req = []*models.Inspection{} } //查询并分页 if t < 1 || t > 5 { res := db.Scopes(models.Paginate(page, pageSize)).Where("facility_id=?", code).Find(&req) if res.RowsAffected == 0 { resp.Code = 400 resp.Msg = "记录不存在" ctx.JSON(400, resp) return } } else { res := db.Scopes(models.Paginate(page, pageSize)).Raw("SELECT * FROM flaws WHERE facility_id = ? "+ "UNION SELECT * FROM issues WHERE facility_id = ? "+ "UNION SELECT * FROM records WHERE facility_id = ? "+ "UNION SELECT * FROM qualities WHERE facility_id = ? "+ "UNION SELECT * FROM inspections WHERE facility_id = ?", "code", "code", "code", "code", "code").Find(&req) if res.RowsAffected == 0 { resp.Code = 400 resp.Msg = "记录不存在" ctx.JSON(400, resp) return } } resp.Data = req ctx.JSON(200, resp) } else if label < 1 || label > 4 { var req []*Total res := db.Scopes(models.Paginate(page, pageSize)).Raw("SELECT * FROM flaws WHERE label = ? "+ "UNION SELECT * FROM issues WHERE label = ? "+ "UNION SELECT * FROM records WHERE label = ? "+ "UNION SELECT * FROM qualities WHERE label = ? "+ "UNION SELECT * FROM inspections WHERE label = ?", "label", "label", "label", "label", "label").Find(&req) if res.RowsAffected == 0 { resp.Code = 400 resp.Msg = "记录不存在" ctx.JSON(400, resp) return } resp.Data = req ctx.JSON(200, resp) } else { ctx.JSON(400, models.Response{ Code: 400, Msg: "参数有误", }) return } }

怎么精简代码func BasinTree(id string) ([]*models.Basin, error) { var basins []*models.Basin res := common.DB.Where("watershed_id = ?", id).Find(&basins) for _, item := range basins { if res.RowsAffected > 0 { //查询流域内所有河道 var subrivers []*models.SubRiver var rivers models.PsRiver common.DB.Model(&rivers).Where("watershed_id = ?", item.ID).Find(&subrivers) item.SubRivers = subrivers var totalL float64 common.DB.Table("ps_rivers").Select("COALESCE(sum(segment_length), 0)").Where("watershed_id = ?", item.ID).Scan(&totalL) item.TotalLength = totalL //查询流域内所有湖泊 var sublakes []*models.SubLake var lakes models.PsLake common.DB.Model(&lakes).Where("watershed_id = ?", item.ID).Find(&sublakes) var totalA float64 common.DB.Table("ps_lakes").Select("COALESCE(sum(area),0)").Where("watershed_id = ?", item.ID).Scan(&totalA) item.TotalArea = totalA item.SubLakes = sublakes } } for _, item := range basins { if res.RowsAffected > 0 { id = strconv.FormatUint(uint64(item.ID), 10) item.SubBasins, _ = BasinTree(id) for _, v := range item.SubBasins { item.TotalArea = item.TotalArea + v.TotalArea item.TotalLength = item.TotalLength + v.TotalLength } if len(item.SubBasins) == 0 { return nil, nil } } } return basins, nil } func BasinInfo(ctx *gin.Context) { id := ctx.Query("id") var req models.Basin var err error resp := models.Response{ Code: 0, Msg: "success", } if len(id) == 0 { resp.Code = 400 resp.Msg = "请输入id值" ctx.JSON(400, resp) return } res := common.DB.Where("id = ?", id).Take(&req) if res.Error != nil { resp.Code = 400 resp.Msg = "查询失败" resp.Data = res.Error ctx.JSON(400, resp) return } //查询流域内所有河道 var subrivers []*models.SubRiver var rivers models.PsRiver var totalL float64 common.DB.Model(&rivers).Where("watershed_id = ?", id).Find(&subrivers) common.DB.Table("ps_rivers").Select("COALESCE(sum(segment_length), 0)").Where("watershed_id = ?", id).Scan(&totalL) req.SubRivers = subrivers req.TotalLength = totalL //查询流域内所有湖泊 var sublakes []*models.SubLake var lakes models.PsLake var totalA float64 common.DB.Model(&lakes).Where("watershed_id = ?", id).Find(&sublakes) common.DB.Table("ps_lakes").Select("COALESCE(sum(area),0)").Where("watershed_id = ?", id).Scan(&totalA) req.SubLakes = sublakes req.TotalArea = totalA req.SubBasins, err = BasinTree(id) if err != nil { resp.Code = 500 resp.Msg = "创建树失败" resp.Data = err ctx.JSON(500, resp) return } for _, v := range req.SubBasins { req.TotalArea = req.TotalArea + v.TotalArea req.TotalLength = req.TotalLength + v.TotalLength } resp.Data = req ctx.JSON(200, resp) }

最新推荐

recommend-type

基于Android Studio的个人记账应用帮助用户轻松管理和跟踪他们的财务源码.zip

基于Android Studio的个人记账应用帮助用户轻松管理和跟踪他们的财务源码.zip基于Android Studio的个人记账应用帮助用户轻松管理和跟踪他们的财务源码.zip基于Android Studio的个人记账应用帮助用户轻松管理和跟踪他们的财务源码.zip基于Android Studio的个人记账应用帮助用户轻松管理和跟踪他们的财务源码.zip基于Android Studio的个人记账应用帮助用户轻松管理和跟踪他们的财务源码.zip基于Android Studio的个人记账应用帮助用户轻松管理和跟踪他们的财务源码.zip基于Android Studio的个人记账应用帮助用户轻松管理和跟踪他们的财务源码.zip基于Android Studio的个人记账应用帮助用户轻松管理和跟踪他们的财务源码.zip基于Android Studio的个人记账应用帮助用户轻松管理和跟踪他们的财务源码.zip基于Android Studio的个人记账应用帮助用户轻松管理和跟踪他们的财务源码.zip
recommend-type

基于python实现树莓派和传感器的植物生长环境评估信息系统

【作品名称】:基于python实现树莓派和传感器的植物生长环境评估信息系统 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:基于python实现树莓派和传感器的植物生长环境评估信息系统
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用 Python 画一个可以动的爱心

好的,我可以帮助您使用Python来绘制一个动态的爱心。您可以使用turtle库来实现。以下是实现代码: ```python import turtle import math # 设置画布和画笔 canvas = turtle.Screen() canvas.bgcolor("black") pencil = turtle.Turtle() pencil.speed(0) pencil.color("red", "pink") pencil.pensize(3) # 定义爱心函数 def draw_love(heart_size, x_offset=0, y_offset=0):
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

实现实时监控告警系统:Kafka与Grafana整合

![实现实时监控告警系统:Kafka与Grafana整合](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X2pwZy9BVldpY3ladXVDbEZpY1pLWmw2bUVaWXFUcEdLT1VDdkxRSmQxZXB5R1lxaWNlUjA2c0hFek5Qc3FyRktudFF1VDMxQVl3QTRXV2lhSWFRMEFRc0I1cW1ZOGcvNjQw?x-oss-process=image/format,png) # 1.1 Kafka集群架构 Kafka集群由多个称为代理的服务器组成,这
recommend-type

已知n个人(以编号0,1,2,3...n-1分别表示)围坐在一张圆桌周围。从编号为0的人开始报数1,数到m的那个人出列;他的下一个人又从1开始报数,数到m+1的那个人又出列(每次报数值加1);依此规律重复下去,直到圆桌周围的人全部出列。用递归方法解决

这个问题可以使用递归方法解决。下面是一个思路: 1. 定义一个函数,接收三个参数:n、m、i,表示还剩下n个人,每次数到m时出列,当前报数的人是i; 2. 如果n=1,返回i,即最后留下的那个人的编号; 3. 否则,计算出下一个出列的人的编号j,通过递归调用函数解决n-1个人的问题,其结果为k; 4. 如果k < j,即当前i之后出列的人的编号为k,需要将k转换为在i之前出列的编号,返回值为 k+(n-1); 5. 如果k>=j,即当前i之后出列的人的编号为k,返回值为 k-(j-1); 下面是对应的Python代码: ```python def josephus(n, m, i):