GORM学习笔记

news/2025/1/9 3:27:57/

GORM学习笔记

官方文档:https://gorm.io/zh_CN/docs/

1、数据准备

create table student
(id         int auto_incrementprimary key,sn         varchar(20) null,name       varchar(20) null,email      varchar(20) null,class_id   int         null,monitor_id int         null
);

2、快速开始

2.1、安装依赖

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

2.2、db

package modelimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)var DB *gorm.DB
var err error// Student 属性需大写
type Student struct {Id        intSn        stringName      stringEmail     stringClassId   intMonitorId int
}func (s Student) TableName() string {return "student"
}func init() {dsn := "root:Chace2233.@tcp(127.0.0.1:3306)/study?charset=utf8&parseTime=True&loc=Local"DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {fmt.Println(err)}fmt.Println(DB)
}

2.3、controller

package controllerimport ("fmt""ginstudy/model""github.com/gin-gonic/gin""net/http""strconv"
)type StudentController struct {}func (student StudentController) Select(c *gin.Context) {var users []model.Student// 全量查询//model.DB.Find(&users)// 条件查询model.DB.Where("id<6").Find(&users)c.JSON(http.StatusOK, users)
}func (student StudentController) Insert(c *gin.Context) {var user = model.Student{Sn: "10019", Name: "aaa", Email: "aaa@aynu.com", ClassId: 1, MonitorId: 1}tx := model.DB.Create(&user)fmt.Println(tx.Error)if tx.Error != nil {c.JSON(http.StatusOK, gin.H{"insert":  "error","message": tx.Error,})} else {c.JSON(http.StatusOK, gin.H{"insert": "success",})}
}func (student StudentController) Update(c *gin.Context) {id, _ := strconv.Atoi(c.Param("id"))// 修改方式1//var user = model.Student{Id: id}//model.DB.Find(&user)//user.Name = "5A+"//tx := model.DB.Save(&user)//if tx.Error != nil {//	c.JSON(http.StatusOK, gin.H{//		"update":  "error",//		"message": tx.Error,//	})//} else {//	c.JSON(http.StatusOK, gin.H{//		"update": "success",//	})//}// 修改方式2tx := model.DB.Model(&model.Student{}).Where("id=?", id).Update("name", "gorm")if tx.Error != nil {c.JSON(http.StatusOK, gin.H{"update":  "error","message": tx.Error,})} else {c.JSON(http.StatusOK, gin.H{"update": "success",})}
}func (student StudentController) Delete(c *gin.Context) {id, _ := strconv.Atoi(c.Param("id"))var user = model.Student{Id: id}tx := model.DB.Delete(&user)if tx.Error != nil {c.JSON(http.StatusOK, gin.H{"delete":  "error","message": tx.Error,})} else {c.JSON(http.StatusOK, gin.H{"delete": "success",})}
}

2.4、router

package routerimport ("ginstudy/controller""github.com/gin-gonic/gin"
)func StudentRouter(r *gin.Engine) {group := r.Group("/student")studentController := controller.StudentController{}{group.GET("/", studentController.Select)group.POST("/insert", studentController.Insert)group.PUT("/update/:id", studentController.Update)group.DELETE("/delete/:id", studentController.Delete)}
}

3、查询

3.1、字段别名

type Student struct {Id        int    `json:"id"`Sn        string `json:"sn"`Name      string `json:"name"`Email     string `json:"email"`ClassId   int    `json:"class-id"`MonitorId int    `json:"monitor-id"`
}

3.2、条件查询

func (student StudentController) Select(c *gin.Context) {var users []model.Student// 全量查询//model.DB.Find(&users)// 条件查询1//model.DB.Where("id<6").Find(&users)//model.DB.Where("id<?", 6).Find(&users)// 条件查询2//model.DB.Where("id>1 and id<5").Find(&users)//model.DB.Where("id>? and id<=?", 1, 5).Find(&users)// 条件查询3//model.DB.Where("id in (?)", []int{1, 5}).Find(&users)// 条件查询4//model.DB.Where("name like ?", "%zhou%").Find(&users)// 条件查询5//model.DB.Where("id between ? and ?", 1, 3).Find(&users)// 条件查询6//model.DB.Where("id = ? or id = ?", 1, 3).Find(&users)model.DB.Where("id = ? or id = ?", 1, 3).Or("id = ?", 5).Find(&users)c.JSON(http.StatusOK, users)
}

3.3、指定字段

其他字段置空,可自定义结构体(注意指定表名)

func (student StudentController) Select(c *gin.Context) {var users []model.Student// 全量查询model.DB.Select("id,name").Find(&users)c.JSON(http.StatusOK, users)
}

3.4、排序

func (student StudentController) Select(c *gin.Context) {var users []model.Student// 全量查询model.DB.Order("id desc").Find(&users)c.JSON(http.StatusOK, users)
}

3.5、分页查询

func (student StudentController) Select(c *gin.Context) {var users []model.Student// 全量查询model.DB.Order("id desc").Offset(3).Limit(2).Find(&users)c.JSON(http.StatusOK, users)
}

3.6、计数

func (student StudentController) Select(c *gin.Context) {var users []model.Student// 全量查询var count int64model.DB.Find(&users).Count(&count)fmt.Println(count)c.JSON(http.StatusOK, users)
}

4、原生SQL

4.1、原生插入

func (student StudentController) Exec(c *gin.Context) {model.DB.Exec("INSERT INTO student (sn, name, email, class_id, monitor_id) VALUES ('10020', 'ceshi', 'ceshi@qq.com', 1, 2)")c.JSON(http.StatusOK, gin.H{"status": "success",})
}

4.2、原生修改

func (student StudentController) Exec(c *gin.Context) {model.DB.Exec("update student set name=?  where sn=?", "gorm", 10019)c.JSON(http.StatusOK, gin.H{"status": "success",})
}

4.3、原生删除

func (student StudentController) Exec(c *gin.Context) {model.DB.Exec("delete from student where sn=?", 10019)c.JSON(http.StatusOK, gin.H{"status": "success",})
}

4.3、原生查询

func (student StudentController) Exec(c *gin.Context) {var users []model.Studentmodel.DB.Raw("select * from student").Scan(&users)c.JSON(http.StatusOK, gin.H{"status": "success","data":   users,})
}

http://www.ppmy.cn/news/1217883.html

相关文章

fileread任意文件读取学习笔记

任意文件读取概述 一些网站的需求&#xff0c;可能会提供文件查看与下载的功能。如果对用户查看或下载的文件没有限制或者限制绕过&#xff0c;就可以查看或下载任意文件。这些文件可以是源代码文件&#xff0c;配置文件&#xff0c;敏感文件等等。 任意文件读取会造成&#x…

台式电脑的IP地址在哪里?解密台式电脑网络连接的秘密!

​ 如今智能手机和便携式笔记本电脑盛行的时代&#xff0c;台式电脑似乎逐渐被人们所忽视。然而&#xff0c;对于需要高性能和大容量存储的用户来说&#xff0c;台式电脑依然是最好的选择。而作为一款能够连接网络的设备&#xff0c;台式电脑也有自己独特的IP地址。下面虎观代理…

ubuntu小技巧30--23.10桌面版安装钉钉启动报错undefined symbol: FT_Get_Color_Glyph_Layer

ubuntu小技巧30-- 23.10桌面版安装钉钉启动报错undefined symbol: FT_Get_Color_Glyph_Layer 介绍解決方法说明 介绍 近期在电脑上安装了 ubuntu 23.10桌面版本, 安装最新版钉钉后无法正常打开软件&#xff0c;报错 undefined symbol: FT_Get_Color_Glyph_Layer &#xff0c;具…

突破职场竞争,引领未来发展:考取《研发效能(DevOps)工程师职业技术认证》

就业形势堪忧&#xff0c;什么最有保障&#xff1f;考个“国家级”证书傍身吧&#xff01; 工信部教考中心作为中国领先的行业技能认证机构&#xff0c;其颁发的认证证书不仅代表了个人在信息技术领域的专业能力&#xff0c;更可以录入工业和信息化技术技能人才数据库&#xf…

景联文科技:驾驭数据浪潮,赋能AI产业——全球领先的数据标注解决方案供应商

根据IDC相关数据统计&#xff0c;全球数据量正在经历爆炸式增长&#xff0c;预计将从2016年的16.1ZB猛增至2025年的163ZB&#xff0c;其中大部分是非结构化数据&#xff0c;被直接利用&#xff0c;必须通过数据标注转化为AI可识别的格式&#xff0c;才能最大限度地发挥其应用价…

高德地图系列(一):vue项目如何使用高德地图、入门以及基本控件使用

目录 第一章 前言 第二章 准备工作 2.1 账号注册 2.2 高德地图开发平台文档 2.3 创建应用 第三章 使用地图 3.1 地图使用步骤 3.2 理解几个地图基础控件 3.3 基础类理解 第一章 前言 小编都是在vue项目中使用高德地图的&#xff0c;每一个功能都会亲测可用之后才会…

XUbuntu22.04之安装pkg-config(一百九十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

ubuntu20安装opencv4和opencv_contrib 多版本共存

openCV 卸载 openCV 安装后的源码尽可能保留&#xff0c;因为可以直接从build文件夹下卸载已经安装的openCV. 参考链接&#xff1a;视觉学习笔记10——opencv的卸载、安装与多版本管理 如果已经安装完openCV,后续想重新装&#xff0c;需要先卸载掉安装的openCV. 在ubuntu终端…