Gorm_快速入门

快速入门

gorm地址:https://github.com/go-gorm/gorm

对开发者友好的gorm库,目前使用最广的go orm库之一

1. 准备工作

数据库以目前使用最多的mysql为例。

//安装MySQL驱动
go get -u gorm.io/driver/mysql
//安装gorm包
go get -u gorm.io/gorm
//安装gin
go get -u github.com/gin-gonic/gin

涉及到的数据库sql:

CREATE TABLE `users` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID',`username` varchar(30) NOT NULL COMMENT '账号',`password` varchar(100) NOT NULL COMMENT '密码',`createtime` bigint(20) NOT NULL DEFAULT 0 COMMENT '创建时间',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

新建model目录,在model目录下新建一个文件user.go

//定义User模型,绑定users表,ORM库操作数据库,需要定义一个struct类型和MYSQL表进行绑定或者叫映射,struct字段和MYSQL表字段一一对应
package modeltype User struct {ID int64 // 主键//通过在字段后面的标签说明,定义golang字段和表字段的关系//例如 `gorm:"column:username"` 标签说明含义是: Mysql表的列名(字段名)为usernameUsername string `gorm:"column:username"`Password string `gorm:"column:password"`//创建时间,时间戳CreateTime int64 `gorm:"column:createtime"`
}func (u User) Table() string {return "users"
}

新建目录global,在该目录上新建文件global.go

package globalimport "gorm.io/gorm"var DB *gorm.DB

新建目录inition,在该目录下新建初始化文件init.go

package initionimport ("GinStudy/helloworld/global""fmt""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger"
)func InitDB() {//配置MySQL连接参数username := "root"    //账号password := "123456"  //密码host := "127.0.0.1"   //数据库地址,可以是Ip或者域名port := 3306          //数据库端口Dbname := "gin_study" //数据库名dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", username, password, host, port, Dbname)db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info),})if err != nil {panic("连接数据库失败, error=" + err.Error())}global.DB = db
}

2.插入数据

新建servcie目录,在该目录下新建user.go

package serviceimport ("GinStudy/helloworld/global""GinStudy/helloworld/model"
)type UserService struct {
}func (u UserService) SaveUser(user model.User) error {err := global.DB.Create(&user).Errorreturn err
}

在inition该目录下建立router.go

package initionimport ("GinStudy/helloworld/router""github.com/gin-gonic/gin"
)func RegisterRouter(r *gin.Engine) {r.GET("/user/save", router.SaveUser)
}

新建router目录,在该目录下建立user.go

package routerimport ("GinStudy/helloworld/model""GinStudy/helloworld/service""github.com/gin-gonic/gin""net/http""time"
)func SaveUser(c *gin.Context) {err := service.UserService{}.SaveUser(model.User{Username:   "zhangsan2",Password:   "123456",CreateTime: time.Now().UnixMilli(),})if err != nil {c.JSON(202, gin.H{"message": "添加失败",})} else {c.JSON(http.StatusOK, gin.H{"message": "添加用户成功",})}
}

在main.go编写如下内容

package mainimport ("GinStudy/helloworld/inition""github.com/gin-gonic/gin"
)func main() {r := gin.Default()inition.InitDB()inition.RegisterRouter(r)r.Run()
}

运行main.go,然后在浏览器或POSTMAN上运行

http://localhost:8080/user/save

可看到

{"message":"添加用户成功"}

3.查询

在 service/user.go增加如下内容

func (u UserService) GetUserById(id int) (user model.User, err error) {err = global.DB.Model(&model.User{}).Where("id=?", id).Find(&user).Errorreturn user, err
}

在router/user.go增加如下内容

func GetUserInfo(c *gin.Context) {userInfo, err := service.UserService{}.GetUserById(1)if err != nil {c.JSON(202, gin.H{"data":    userInfo,"message": "查询失败",})} else {c.JSON(http.StatusOK, gin.H{"data":    userInfo,"message": "添加用户成功",})}
}

在inition/router.go增加如下内容

r.GET("/user/userInfo", router.GetUserInfo)

最后启动main.go,在浏览器上运行 http://localhost:8080/user/userInfo,最终得到如下结果

{"data":{"ID":1,"Username":"zhangsan","Password":"123456","CreateTime":1715762629632},"message":"添加用户成功"}

4.更新

在 service/user.go增加如下内容

func (u UserService) UpdateUser(id int) (err error) {err = global.DB.Model(&model.User{}).Where("id=?", id).Update("username", "lisi").Errorreturn err
}

在router/user.go增加如下内容

func UpdateUserInfo(c *gin.Context) {err := service.UserService{}.UpdateUser(1)if err != nil {c.JSON(202, gin.H{"message": "更新失败",})} else {c.JSON(http.StatusOK, gin.H{"message": "更新成功",})}
}

在inition/router.go增加如下内容

r.GET("/user/updateUserInfo", router.UpdateUserInfo)

最后启动main.go,在浏览器上运行 http://localhost:8080/user/updateUserInfo,最终得到如下结果

{"message":"更新成功"}

5.删除

在 service/user.go增加如下内容

func (u UserService)DeleteById(id int64)(err error) {err = global.DB.Model(&model.User{}).Where("id=?", id).Delete(&model.User{})return err
}

在router/user.go增加如下内容

func DeleteUser(c *gin.Context) {err := service.UserService{}.DeleteById(1)if err != nil {c.JSON(202, gin.H{"message": "删除失败",})} else {c.JSON(http.StatusOK, gin.H{"message": "删除成功",})}
}

在inition/router.go增加如下内容

	r.GET("/user/delUser", router.DeleteUser)

最后启动main.go,在浏览器上运行 http://localhost:8080/user/delUser,最终得到如下结果

{"message":"删除成功"}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

免费公有云轻量级云服务,支持免费云数据库和创建应用,支持多语言应用!

在今天这个数字化迅速发展的时代,选择一个高效、经济且功能全面的云平台对于任何大小的企业来说都是至关重要的。MemFire Cloud 作为市场上新兴的星级云服务提供商,以其免费的公有云服务和对多种编程语言的支持,提供了一站式解决方案&#xf…

【C++】类和对象终章 --内部类和匿名对象,再识类和对象

欢迎来到CILMY23的博客 🏆本篇主题为: 类和对象终章 --内部类和匿名对象,再识类和对象 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux …

51单片机超声波测距_液位检测_温度检测原理图PCB仿真代码

目录 实物图: PCB ​原理图​ 仿真图 ​编辑 程序 资料下载地址:51单片机超声波测距-液位检测-温度检测原理图PCB仿真代码 主控为stc89c52,通过ds18b20进行温度采集,超声波测距,距离不可以超过1m,通过按键可以设…

CAD插入文字到另一图形样式变相同

CAD从一张图形复制到另外一张图形后,文字样式变成一样是因为两张图所用的文字样式名称一样,但是样式里面的使用字体样式不一样。如下图所示,找到工具栏中的注释 ,点击文字样式。里面就会显示当前图形中使用的样式名称及其对应的字…

拓扑排序板子

经过一晚上的不懈努力,创造出了一个很烂的拓扑排序的板子 这是精简版 using ll long long; struct tsort {int n;std::vector<std::vector<int>>g, w;std::vector<int>r, c, dp,f;std::queue<int>q;tsort(int n_) {n n_;g.resize(n 1);w.resize(…

Java内存详解

内存区域、内存模型 内存区域&#xff1a;即运行时数据区域&#xff0c;指JVM对于不同类型数据在内存中的存储方式内存模型&#xff08;JMM&#xff1a;Java Memory Model&#xff09;&#xff1a;定义了线程与主内存之间的抽象关系&#xff0c;即JVM在内存中的工作方式&#…

微信小程序如何使用weui组件库?

一、方法一&#xff1a;通过npm安装 通过npm构建方式引入weui组件库 &#xff08;找到.eslintrc.js 右键&#xff0c;在内件终端打开&#xff09;打开命令提示符后&#xff0c;输入 &#xff08;1&#xff09;npm init -y来快速生成一个默认的package.json文件 &#xff08;…

鸿蒙 装饰器@builder 使用中的问题 以及解决方案

builder装饰器 一 介绍Builder装饰器&#xff1a;自定义构建函数二 问题点三 解决方法四 仓库地址 一 介绍Builder装饰器&#xff1a;自定义构建函数 用于填充UI组件 开发者可以将重复使用的UI元素抽象成一个方法&#xff0c;在build方法里调用。 根据场景分类 组件内自定义构…

设计非递归算法,编程:在二叉排序树中,打印关键码a, b的公共祖先。注:例,若a是b的祖先,则a不算作公共祖先。反之亦然。

二叉排序树&#xff1a; 代码&#xff1a; #include <iostream> using namespace std;// 定义二叉树节点结构 typedef struct BTNode {char show;struct BTNode* left;struct BTNode* right; } BTNode;// 非递归插入节点的函数 BTNode* insertNode(BTNode* root, char k…

Leetcode - 周赛397

目录 一&#xff0c;3146. 两个字符串的排列差 二&#xff0c;3147. 从魔法师身上吸取的最大能量 三&#xff0c;3148. 矩阵中的最大得分 四&#xff0c;3149. 找出分数最低的排列 一&#xff0c;3146. 两个字符串的排列差 本题就是求同一个字符在两个字符串中的下标之差的…

QCustomPlot的了解

&#xff08;一&#xff09;QCustomPlot常见属性设置、多曲线绘制、动态曲线绘制、生成游标、矩形放大等功能实现-CSDN博客 关键代码&#xff1a; QT core gui printsupport 使用上面文章中的代码跑起来的程序效果图&#xff1a; 我的学习过程&#xff1a; 最开始初…

家用充电桩远程监控安全管理系统解决方案

家用充电桩远程监控安全管理系统解决方案 在当今电动汽车日益普及的背景下&#xff0c;家用充电桩的安全管理成为了广大车主关注的重点问题。为了实现对充电桩的高效、精准、远程监控&#xff0c;一套完善的家用充电桩远程监控安全管理系统解决方案应运而生。本方案旨在通过先…

如何去除字符串两侧的空白字符?

TRIM函数会去掉字符串左侧和右侧的空格&#xff0c;语法是&#xff1a;TRIM(字符串) excel中&#xff0c;TRIM函数能去掉字符串左侧和右侧的空格&#xff0c;它的ASCII码是32。 以下设定一个字符串组合&#xff0c;它的第一个字符中空格&#xff0c;最后一个字符是换行符 &q…

Python专题:十七、做个小游戏

终端小游戏 1、根据题库内容出单选题 2、提示作答&#xff0c;并给结果 思路 列表 保存题目 字典 保存题干&#xff0c;选项和答案 遍历 题目列表用于展示 input函数 等待用户输入 判断输入&#xff0c;并继续提示 计算正确率并打印 题库…

oracle不得不知道的sql

一、oracle 查询语句 1.translate select translate(abc你好cdefgdc,abcdefg,1234567)from dual; select translate(abc你好cdefgdc,abcdefg,)from dual;--如果替换字符整个为空字符 &#xff0c;则直接返回null select translate(abc你好cdefgdc,abcdefg,122)from dual; sel…

【Linux进程通信 —— 管道】

Linux进程通信 —— 管道 进程间通信介绍进程间通信的概念进程间通信的目的进程间通信的本质进程间通信的分类 管道什么是管道匿名管道匿名管道的原理pipe用fork来共享管道原理站在文件描述符角度-深度理解管道站在内核角度-管道本质管道读写规则管道的特点管道的四种特殊情况管…

2024软件测试必问的常见面试题1000问!

01、您所熟悉的测试用例设计方法都有哪些&#xff1f;请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。 答&#xff1a;有黑盒和白盒两种测试种类&#xff0c;黑盒有等价类划分法&#xff0c;边界分析法&#xff0c;因果图法和错误猜测法。白盒有逻辑覆盖法&…

三子棋游戏

1、实现三子棋 test.c //测试游戏的逻辑 game.c //游戏代码的实现 game.h //游戏代码的声明&#xff08;函数声明&#xff0c;符号定义&#xff09; 1、 在主函数里实现&#xff0c;首先有个界面&#xff0c;让玩家选择是否玩游戏。上来就先打印菜单&#xff0c;用do ... …

优秀测试的核心能力!2招高效定位分析BUG!

之所以写这一篇文章&#xff0c;是突然想起来曾经在测试过程中被开发嘲讽过&#xff0c;事情是这样的&#xff0c;当时发现了一个疑似前端的Bug就草草提交到了禅道&#xff0c;结果刚来的女前端看到了就有点生气地问我为啥不查清到底是前后端问题就直接派给她前端了&#xff0c…

【python量化交易】—— Alpha选股策略 - Qteasy自定义交易策略【附源码】

使用qteasy创建并回测Alpha选股交易策略 使用qteasy创建并回测Alpha选股交易策略策略思想第一种自定义策略设置方法&#xff0c;使用持仓数据和选股数据直接生成比例交易信号PS信号&#xff1a;第二种自定义策略设置方法&#xff0c;使用PT交易信号设置持仓目标&#xff1a;第三…