Gin框架简易搭建(3)--Grom与数据库

写在前面

项目地址

个人认为GORM 指南这个网站是相比较之下最为清晰的框架介绍

但是它在环境搭建阶段对于初学者而言不是很友好,尤其是使用mysql指令稍有不同,以及更新的方法和依赖问题都是很让人头疼的,而且这些报错并非逻辑上的,往往是网络端口,数据库创建等没有接触过的内容,因此我建议可以在学习使用增删改查的操作时看框架教程,配置环境使用以下的学习步骤:

  1. 首先,下载mysql,以及三选一mysqlshell,navicat,dbreaver(个人感觉第二个的破解版手感是最丝滑的),对于初学一个东西,我认为可视化是最好的帮助和激励

  2. 在创建和连接数据库的时候,搜一下“Navicat使用快速入门教程”,对于数据库连接不成功的情况,往往是因为没有启动服务,这个在任务管理器->服务->mysql90(或80),找到之后右键手动打开即可,简单学一下建表(增删改查都看一下也可以,大概十几分钟就搞定)

  3. 之后,使用下面两个命令在项目中搭建gorm环境

    go get -u gorm.io/gorm
    go get -u gorm.io/driver/mysql
    
  4. 然后,按照下面的文件结构去添加文件夹和文件即可,由于版本的原因,我直接上传所有新增文件,并且以注释的形式去解释每部分的作用

    在这里插入图片描述

文件及解析

dao.go

package daoimport ("Ranking/config""Ranking/pkg/logger""gorm.io/driver/mysql" // 引入 MySQL 驱动"gorm.io/gorm"         // 引入 Gorm"time"
)var (Db  *gorm.DBerr error
)func init() {// 使用 gorm.Open 打开 MySQL 数据库连接Db, err = gorm.Open(mysql.Open(config.Mysqldb), &gorm.Config{})if err != nil {logger.Error(map[string]interface{}{"mysql connect error": err.Error()})return // 连接失败,提前返回}// 获取底层的 sql.DBsqlDB, err := Db.DB()if err != nil {logger.Error(map[string]interface{}{"get DB instance error": err.Error()})return // 获取 DB 实例失败,提前返回}// 配置连接池参数sqlDB.SetMaxIdleConns(10)           // 设置最大空闲连接数sqlDB.SetMaxOpenConns(100)          // 设置最大打开连接数sqlDB.SetConnMaxLifetime(time.Hour) // 设置连接的最大可重用时长
}

models包user.go

package modelsimport "Ranking/dao"type User struct {Id       intUsername string
}func (User) TableName() string {return "user"
}// GetUsersTest 根据用户ID获取用户信息
func GetUsersTest(id int) (User, error) {var user User//where在 SQL 中生成一个 WHERE 子句,以便查找满足条件的记录,?是占位符//first方法用于查找单个记录,如果找到,则返回该记录,否则返回错误err := dao.Db.Where("id =?", id).First(&user).Errorreturn user, err
}

controllers->user.go重写一个方法

func (u UserController) GetUserInfo(c *gin.Context) {idStr := c.Param("id")name := c.Param("name")id, _ := strconv.Atoi(idStr)user, _ := models.GetUsersTest(id)ReturnSuccess(c, 0, name, user, 1)}

路由(调用getuserinfo,需要传入id)

user.GET("/info/:id", controllers.UserController{}.GetUserInfo)

最需要注意的就是db文件的配置

运行检查:

数据库构建:

在这里插入图片描述

id是创建的数据库里面的id键值(主键)

在这里插入图片描述

增删改查的实现

实现思路:

router.go创建路由
控制user.go创建函数
模块user.go创建方法

代码

可以参考项目地址

router.go

package routerimport ("Ranking/controllers""Ranking/pkg/logger""github.com/gin-gonic/gin""net/http"
)// 路由 函数的名字要大写,这样才可以被其他包访问!
func Router() *gin.Engine {//创建一个路由的实例r := gin.Default()//日志r.Use(gin.LoggerWithConfig(logger.LoggerToFile()))r.Use(logger.Recover)//实现GET路由 获取r.GET("/hello", func(ctx *gin.Context) {ctx.String(http.StatusOK, "hello world")})//创建这样一个组,简化代码user := r.Group("/user"){//查询单条数据user.GET("/info/:id", controllers.UserController{}.GetUserInfo)//查询列表数据user.POST("/list", controllers.UserController{}.GetList)//添加数据user.POST("/add", controllers.UserController{}.AddUser)//修改数据user.POST("/update", controllers.UserController{}.UpdateUser)//删除单个用户的数据user.POST("/delete", controllers.UserController{}.DeleteUser)//获取用户列表user.GET("/info/list", controllers.UserController{}.GetAllUsers)user.DELETE("/delete", func(ctx *gin.Context) {ctx.String(http.StatusOK, "user delete")})}order := r.Group("/order"){order.GET("/list", controllers.OrderController{}.GetList)}return r
}

控制user.go

package controllersimport ("Ranking/models""Ranking/pkg/logger""fmt""github.com/gin-gonic/gin""strconv"
)// 实现关于用户的功能
type UserController struct{}func (u UserController) GetUserInfo(c *gin.Context) {idStr := c.Param("id")name := c.Param("name")id, _ := strconv.Atoi(idStr)user, _ := models.GetUsersTest(id)ReturnSuccess(c, 0, name, user, 1)}func (u UserController) GetList(c *gin.Context) {// 程序员手动设置的日志logger.Write("日志信息", "user")defer func() {if err := recover(); err != nil {fmt.Println("捕获异常:", err)}}()num1, num2 := 1, 0num3 := num1 / num2ReturnUserGetListError(c, 404, num3)
}func (u UserController) AddUser(c *gin.Context) {//logger.Write("日志信息", "user")username := c.DefaultPostForm("username", "")// 输入检查if username == "" {ReturnError(c, 400, "用户名不能为空")return}id, err := models.AddUser(username)if err != nil {ReturnError(c, 400, "用户添加失败"+err.Error()) // 返回具体错误信息return}ReturnSuccess(c, 0, "用户添加成功", id, 1)
}// 更新用户名
func (u UserController) UpdateUser(c *gin.Context) {//获取用户信息username := c.DefaultPostForm("username", "")idStr := c.DefaultPostForm("id", "")id, _ := strconv.Atoi(idStr)//调用方法更新数据库中的用户名models.UpdateUser(id, username)ReturnSuccess(c, 0, "用户更新成功", true, 1)
}// 删除用户
func (u UserController) DeleteUser(c *gin.Context) {//获取ididStr := c.DefaultPostForm("id", "")id, _ := strconv.Atoi(idStr)//调用方法删除数据库中的用户err := models.DeleteUser(id)if err != nil {ReturnError(c, 404, "用户删除失败"+err.Error())}ReturnSuccess(c, 0, "用户删除成功", true, 1)}//func (u UserController) GetAllUsers(c *gin.Context) {
//	users, err := models.GetAllUsers()
//	if err != nil {
//		ReturnError(c, 404, "用户列表获取失败"+err.Error())
//	}
//	ReturnSuccess(c, 0, "用户列表获取成功成功", users, 1)
//}func (u UserController) GetAllUsers(c *gin.Context) {users, err := models.GetAllUsers()if err != nil {ReturnError(c, 404, "用户列表获取失败: "+err.Error())return // 添加 return 结束函数的执行}// 处理成功的情况,避免重复的“成功”字样ReturnSuccess(c, 0, "用户列表获取成功", users, 1)
}

注意,在common.go中有需要新建的返回值方法

模块user.go

package modelsimport ("Ranking/dao""fmt"
)type User struct {Id       intUsername string
}func (User) TableName() string {return "user"
}// GetUsersTest 根据用户ID获取用户信息
func GetUsersTest(id int) (User, error) {var user User//where在 SQL 中生成一个 WHERE 子句,以便查找满足条件的记录,?是占位符//first方法用于查找单个记录,如果找到,则返回该记录,否则返回错误err := dao.Db.Where("id =?", id).First(&user).Errorreturn user, err
}// 调用该方法,存储一个新用户 返回主键和错误信息(controllers包中调用)
func AddUser(username string) (int, error) {user := User{Username: username}err := dao.Db.Create(&user).Errorif err != nil {return 0, fmt.Errorf("添加用户时出错:%w", err) // 返回详细错误}return user.Id, nil
}func UpdateUser(id int, username string) {dao.Db.Model(&User{}).Where("id = ?", id).Update("username", username)
}// DeleteUser 根据用户ID(主键)删除用户
func DeleteUser(id int) error {err := dao.Db.Delete(&User{}, id).Errorreturn err
}//func GetAllUsers() ([]User, error) {
//	var users []User
//	//没存够100号 所以拿这个数来返回整个列表
//	err := dao.Db.Where("id < 100", 100).Find(&users).Error
//	return users, err
//}func GetAllUsers() ([]User, error) {var users []User//没存够100号 所以拿这个数来返回整个列表err := dao.Db.Where("id < ?", 100).Find(&users).Errorif err != nil {return nil, err}return users, nil
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1547841.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

用大模型优化大模型预训练数据,节省20倍计算量,实现显著性能提升!

生成式人工智能研究实验室&#xff08;GAIR&#xff0c;主页&#xff1a;https://plms.ai/&#xff09;是国内首个聚焦于生成式人工智能的高校研究组。汇聚了来自于 CMU、复旦、交大&#xff08;ACM 班、IEEE 试点班等&#xff09;等顶尖高校的年轻本硕博人才。实验室专注于三大…

大数据-150 Apache Druid 安装部署 单机启动 系统架构

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

从‘盲管’到‘智网’,漫途精准构建排水管网监测方案

在城市错综复杂的基础设施网络中&#xff0c;排水管网作为城市的“血脉”&#xff0c;其高效、稳定运行直接关系到城市生活的安宁与财产的安全。面对日益频繁的雨季挑战与气候变化的不确定性&#xff0c;传统“盲管”管理模式已难以满足现代城市治理的需求。 漫途排水管网监测…

LED显示屏如何通过FMEA进行风险分析:打造无忧显示新境界

LED显示屏作为高科技产品&#xff0c;其性能受到多种因素的影响&#xff0c;包括但不限于设计缺陷、材料质量、制造工艺、使用环境等。任何环节的疏漏都可能导致显示屏出现亮度不均、色彩失真、故障频发等问题&#xff0c;进而影响用户体验和品牌形象。因此&#xff0c;通过FME…

Linux标准IO(四)-格式化I/O输入

C 库函数提供了 3 个格式化输入函数&#xff0c;包括&#xff1a;scanf()、fscanf()、sscanf()&#xff0c;其函数定义如下所示&#xff1a; #include <stdio.h> int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(c…

Spring Web MVC课后作业

目录 1.加法计算器 2.⽤户登录 3.留⾔板 1.加法计算器 &#xff08;1&#xff09;需求分析 加法计算器功能, 对两个整数进⾏相加, 需要客⼾端提供参与计算的两个数, 服务端返回这两个整数计算 的结果。 &#xff08;2&#xff09;接⼝定义 请求路径&#xff1a; calc/sum 请…

爬取元气手机壁纸简单案例(仅用于教学,禁止任何非法获利)

爬虫常用的库 爬虫&#xff08;Web Scraping&#xff09;是一种从网页上提取数据的技术。在 Python 中&#xff0c;有许多库可以帮助实现这一目标。以下是一些常用的爬虫库&#xff0c;以及对 BeautifulSoup 的详细介绍。 常用爬虫库 1.Requests ​ a.功能&#xff1a;用于发…

spark计算引擎-架构和应用

一Spark 定义&#xff1a;Spark 是一个开源的分布式计算系统&#xff0c;它提供了一个快速且通用的集群计算平台。Spark 被设计用来处理大规模数据集&#xff0c;并且支持多种数据处理任务&#xff0c;包括批处理、交互式查询、机器学习、图形处理和流处理。 核心架构&#x…

ChatGPT Sidebar 浏览器插件配置指南

随着聊天机器人技术的不断进步&#xff0c;越来越多的人开始依赖这些强大的工具来提高工作效率、获取信息和解决问题。OpenAI 的 ChatGPT 是其中最受欢迎的聊天机器人之一。为了方便用户在浏览网页时随时与 ChatGPT 互动&#xff0c;开发者们设计了一款名为 ChatGPT Sidebar 的…

Latex——一行的划线 如何分开

代码&#xff1a; \cmidrule(r){3-4} \cmidrule(r){5-6} \cmidrule(r){7-8}效果&#xff1a; 参考文章&#xff1a; LaTeX技巧653&#xff1a;如何隔开LaTeX表格邻近\cline表格线&#xff1f;

四,MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)

四&#xff0c;MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用) 文章目录 四&#xff0c;MyBatis-Plus 当中的主键策略和分页插件的(详细实操使用)1. 主键策略1.1 主键生成策略介绍 2. 准备工作&#xff1a;2.1 AUTO 策略2.2 INPUT 策略2.3 ASSIGN_ID 策略2.3.1 雪花算…

电动车、电单车入梯数据集电动车进电梯检测识别(代码+教程+数据集)

数据集介绍 共有 5347 张图像和一一对应的标注文件 标注文件格式提供了两种&#xff0c;包括VOC格式的xml文件和YOLO格式的txt文件。 标注的对象共有以下几种&#xff1a; [‘Electric-bicycle’] 标注框的数量信息如下&#xff1a;&#xff08;标注时一般是用英文标的&am…

AC-DC电源自动测试系统介绍

AC-DC电源模块测试系统是一种高度自动化的测试设备&#xff0c;能够模拟实际工作环境中的交流电输入&#xff0c;并测量电源模块的输出电压、电流、功率等关键参数&#xff0c;以及评估其电磁兼容性、效率、热特性等性能指标。 AC-DC电源模块测试系统的主要硬件组成包括&#…

TDEngine在煤矿综采管控平台中的应用

一、行业背景 智能综采管控平台&#xff0c;是将煤矿综采工作面传感器数据采集&#xff0c;通过可视化界面展示。实现综采工作面的透明化展示&#xff0c;并基于历史的传感器数据进行机器学习的训练&#xff0c;了解工作面周期来压&#xff0c;设备故障检测等数据应用。因此针…

纷享销客生态伙伴大会西安站圆满落幕,共话CRM新纪元

9月19日&#xff0c;以“智享未来&#xff0c;领创CRM新纪元”为主题的纷享销客生态伙伴大会在西安成功举办。本次会议汇聚了SaaS领域、软件行业以及TOB市场的杰出代表、行业领袖以及技术前沿专家&#xff0c;共同探讨SaaS CRM行业的当前发展趋势&#xff0c;并就AI在CRM领域的…

如何使用ssm实现基于web的山东红色旅游信息管理系统的设计与实现

TOC ssm716基于web的山东红色旅游信息管理系统的设计与实现jsp 绪论 1.1研究背景 从古到今&#xff0c;信息的录入&#xff0c;存储&#xff0c;检索都受制于社会生产力的发展&#xff0c;不仅仅浪费大量的人力资源还需要浪费大量的社会物资&#xff0c;并且不能长时间的保…

c++----继承(初阶)

大家好呀&#xff0c;今天我们也是多久没有更新博客了&#xff0c;今天来讲讲我们c加加中的一个比较重要的知识点继承。首先关于继承呢&#xff0c;大家从字面意思看&#xff0c;是不是像我们平常日常生活中很容易出现的&#xff0c;比如说电视剧里面什么富豪啊&#xff0c;去了…

mybatis-puls快速入门

1.概述 在真实项目开发中我们的服务模块&#xff0c;一般都要进行数据库操作&#xff0c;并且每个domain都有crud&#xff0c;需多次写重复代码。我们使用MybatisPlus&#xff0c;就不用写重复代码&#xff0c;并且还有模板的功能&#xff0c;可以一键生成daomin,query,mapper…

如何在 Windows PC 或笔记本电脑上恢复未保存的 Word 文档

辛苦工作成果消失得无影无踪可能是任何人最可怕的噩梦&#xff0c;尤其是如果这是一篇长篇论文或项目报告。此问题可能是由于 Windows PC 或笔记本电脑上未保存的 Word 文档造成的。不过&#xff0c;不要惊慌&#xff1b;您仍然有机会在 Windows 机器上恢复未保存的 Word 文档。…

AI驱动的Java开发框架:Spring AI Alibaba实战部署教程

前言 随着生成式 AI 的快速发展&#xff0c;基于 AI 开发框架构建 AI 应用的诉求迅速增长&#xff0c;涌现出了包括 LangChain、LlamaIndex 等开发框架&#xff0c;但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言&a…