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

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
}

相关文章:

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

写在前面 项目地址 个人认为GORM 指南这个网站是相比较之下最为清晰的框架介绍 但是它在环境搭建阶段对于初学者而言不是很友好&#xff0c;尤其是使用mysql指令稍有不同&#xff0c;以及更新的方法和依赖问题都是很让人头疼的&#xff0c;而且这些报错并非逻辑上的&#xf…...

JavaScript模块化-CommonJS规范和ESM规范

1 ES6模块化 1.1 ES6基本介绍 ES6 模块是 ECMAScript 2015&#xff08;ES6&#xff09;引入的标准模块系统&#xff0c;广泛应用于浏览器环境下的前端开发。Node.js环境主要使用CommonJS规范。ESM使用import和export来实现模块化开发从而解决了以下问题&#xff1a; 全局作用…...

解决银河麒麟V10中的apt Lock异常

解决银河麒麟V10中的apt Lock异常 一、查找并杀掉apt进程二、删除锁文件三、重新尝试apt命令 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在使用银河麒麟V10的apt命令时&#xff0c;如果遇到lock异常&#xff0c;可以按以下步骤解决&…...

windows11环境安装lua及luarocks(踩坑篇)

一、lua安装及下载 官方地址&#xff1a; Lua Binaries Download 从这里就有坑了&#xff0c;下载后先解压win64_bin.zip&#xff0c;之后解压lib&#xff0c;用lib中的文件替换win64的&#xff0c;并把include文件夹复制过去&#xff0c;之后复制并重命名lua54&#xff0c;方…...

Glide基本用法及With方法源码解析

文章目录 引入优点 使用步骤导入依赖权限使用 其他用法占位符错误图片后备回调符圆角过渡动画大小调整gif缩略图 使用RequestOptions缓存机制设置缓存策略清理缓存 使用集成库OkHttpVolley with源码解析getRetrieverGlide.getinitializeGlide getRequestManagerRetriever Reque…...

html中的文本标签(含标签的实现案例)

目录 1.标题标签 2.标题标签的align属性 3.段落标签 4.水平线标签hr 5.换行标签br 6.文本样式标签font ​编辑7.文本格式化标签 8.文本语义标签 1&#xff09;时间time标签 2&#xff09;文本高亮Mark标签 3&#xff09;cite标签 9.特殊字符标签 10.图像标签img 附录&#xff…...

通信协议感悟

本文结合个人所学&#xff0c;简要讲述SPI&#xff0c;I2C&#xff0c;UART通信的特点&#xff0c;限制。 1.同步通信 UART&#xff0c;SPI&#xff0c;I2C三种串行通讯方式&#xff0c;SPI功能引脚为CS&#xff0c;CLK&#xff0c;MOSI&#xff0c;MISO&#xff1b;I2C功能引…...

IDEA几大常用AI插件

文章目录 前言列表GPT中文版TalkXBito AIIDEA自带的AI 前言 最近AI、GPT特别火&#xff0c;IDEA里面又有一堆插件支持GPT&#xff0c;所以做个专题比较一下各个GPT插件 列表 先看idea的plugins里支持哪些&#xff0c;搜索“GPT”之后得到的&#xff0c;我用下来感觉第一第二和…...

51单片机学习第六课---B站UP主江协科技

DS18B20 1、基本知识讲解 2、DS18B20读取温度值 main.c #include<regx52.h> #include"delay.h" #include"LCD1602.h" #include"key.h" #include"DS18B20.h"float T; void main () {LCD_Init();LCD_ShowString(1,1,"temp…...

sadTalker本地编译

SadTalker一款开源的可生成逼真的人像动画的工具。它利用深度学习技术&#xff0c;根据输入的图像和音频&#xff0c;生成具有生动表情和动作的视频。用户可以通过上传照片或使用预设的模型&#xff0c;轻松创建个性化的动画内容. 以上是官网的图, 下边是本地部署生成的,效果差…...

强化学习核心概念与公式总结

强化学习核心概念与公式总结 1. 核心概念 1.1 智能体(Agent)和环境(Environment) 智能体:学习和做决策的实体环境:智能体交互的外部系统1.2 状态(State) 描述环境在特定时刻的情况1.3 动作(Action) 智能体可以执行的操作1.4 奖励(Reward) 环境对智能体动作的即时反馈1.5 策…...

基础算法--双指针【概念+图解+题解+解释】

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 数据结构与算法_Stark、的博客-CSDN博客 其它专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客​​​​​​ 座右铭&a…...

国产化系统/鸿蒙开发足浴店收银源码-收缩左侧———未来之窗行业应用跨平台架构

一、左侧展开后 二、代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head><title></title><meta http-equiv"Content-Type" content"text/html; charsetUTF-8"><style t…...

如何从硬盘恢复丢失/删除的视频

您是否想知道是否可以恢复已删除的视频&#xff1f; 幸运的是&#xff0c;您可以使用奇客数据恢复从硬盘驱动器、SD 卡和 USB 闪存驱动器恢复已删除的视频文件。 你有没有遇到过这样的情况&#xff1a;当你随机删除文件以释放空间时&#xff0c;你不小心按下了一些重要视频的…...

《Effective C++》第三版——设计与声明(1)

参考资料&#xff1a; 《Effective C》第三版 注意&#xff1a;《Effective C》不涉及任何 C11 的内容&#xff0c;因此其中的部分准则可能在 C11 出现后有更好的实现方式。 条款 18&#xff1a;让接口容易被正确使用&#xff0c;不易被误用 好的接口很容易被正确使用&…...

数值计算的程序设计问题举例

### 数值计算的程序设计问题 #### 1. 结构静力分析计算 **涉及领域**&#xff1a;工程力学、建筑工程 **主要问题**&#xff1a;线性代数方程组&#xff08;Linear Algebraic Equations&#xff09; **解释说明**&#xff1a; 在结构静力分析中&#xff0c;我们需要解决复杂的…...

Java之方法的使用

修饰符 返回值 方法名称&#xff08;形式参数&#xff09;{ } 当无参数的时候形式参数中什么都不写。 列如求两个数相加 修饰符可有可无。 方法重载&#xff1a; 1.方法名相同 2.参数列表不同 3。返回值不影响重载...

sudo 命令:掌握系统权限控制,实现安全高效管理

一、命令简介 ​sudo​ 命令允许系统管理员授权普通用户执行特定命令&#xff0c;并以管理员身份运行这些命令&#xff0c;通常需要输入用户自己的密码。 ​​ sudo 全称是"substitute user do"&#xff0c;意为“替用户做”&#xff0c;也就是“以另一个用户的身…...

AndroidStudio导入so文件

点击app 右键依次选择New-Floder-JNI Floder 创建jni目录 将需要的so文件拷贝到jni目录 在app目录下&#xff0c;build.gradle文件的android{}中添加&#xff1a; sourceSets {main{jniLibs.srcDirs [src/main/jni]}}点击一下Sync Project with Gradle Files 然后编译生成AP…...

Kuebernetes 群集基于 Docker 部署

Kuebernetes 群集基于 Docker 部署 实验报告资源列表基础环境一、准备 Docker1、安装 Docker 二、安装 Kubeadm 工具1、配置 yum 源2、安装 Kubeadm 工具 三、初始化 Master 节点1、配置 Master 节点2、常见故障 四、Node 节点加入集群五、部署网络插件&#xff08;CNI&#xf…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...