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

Gin之GORM 操作数据库(MySQL)

GORM 简单介绍

GORM 是 Golang 的一个 orm 框架。简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。使用 ORM框架可以让我们更方便的操作数据库。
GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server

特性

• 全功能 ORM

• 关联 (Has OneHas ManyBelongs ToMany To Many,多态,单表继承)

• Create,SaveUpdateDeleteFind 中钩子方法

• 支持 PreloadJoins 的预加载

• 事务,嵌套事务,Save PointRollback To Saved Point

• Context、预编译模式、DryRun 模式

• 批量插入,FindInBatchesFind/Create with Map,使用 SQL 表达式、Context Valuer

CRUD

• SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询

• 复合主键,索引,约束

• Auto Migration

• 自定义 Logger

• 灵活的可扩展插件 APIDatabase Resolver(多数据库,读写分离)、Prometheus…

• 每个特性都经过了测试的重重考验

• 开发者友好

GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.icon-default.png?t=N7T8https://gorm.io/zh_CN/docs/index.html

1、安装

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

 使用go.mod管理的话,可以import后在编辑器加载(上述安装步骤可略)

2、Gin 中使用 Gorm 连接数据库

models 下面新建 core .go ,建立数据库链接

这段代码是在使用 Golang 中的 GORM 库连接到 MySQL 数据库,让我来解释一下:

1. `dsn := "用户:密码@tcp(ip:数据库端口)/库名?charset=utf8mb4&parseTime=True&loc=Local"`: 这里定义了一个数据源名称(DSN),包括了数据库的连接信息,用户名、密码、协议(tcp)、地址、端口、数据库名(gin)以及一些连接选项(charset=utf8mb4、parseTime=True、loc=Local)。

2. `DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})`: 这一行代码使用 GORM 库中的 `Open` 函数来连接到 MySQL 数据库。它使用了之前定义的数据源名称 `dsn`,并且传递了一个空的 `gorm.Config{}`,表示使用默认配置。

在这段代码中,GORM 是一个用于数据库操作的 Go 语言库,而 `mysql.Open(dsn)` 用于指定使用 MySQL 数据库,并且传递了之前定义的数据源名称。

连接成功后,`DB` 将包含一个数据库连接对象,`err` 将包含可能出现的错误信息。

core.go

package models
//这个操作是目的连接数据库,以及定义操作的是哪个库内的表
import (// 我们使用了go.mod来管理包"fmt""gorm.io/driver/mysql""gorm.io/gorm"
)// ----如果要全局使用数据库,需要先定义
var DB *gorm.DB 
var err errorfunc init(){// 连接数据库// gin是你要选择的操作的库dsn := "root:Hszp@123@tcp(127.0.0.1:3306)/gin?charset=utf8mb4&parseTime=True&loc=Local"DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})// 上面不用冒号,因为上面已经定义了,直接赋值了if err != nil {fmt.Println(err)
}
}

 

3、定义操作数据库的模型

约定 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.icon-default.png?t=N7T8https://gorm.io/zh_CN/docs/conventions.html

虽然在 gorm 中可以指定字段的类型以及自动生成数据表,但是在实际的项目开发中,我们是先设计数据库表,然后去实现编码的。

在实际项目中定义数据库模型注意以下几点:

1、结构体的名称必须首字母大写 ,并和数据库表名称对应。例如:表名称为 user 结构体名称定义成 User,表名称为 article_cate 结构体名称定义成 ArticleCate

2、结构体中的字段名称首字母必须大写,并和数据库表中的字段一一对应。例如:下面结构体中的 Id 和数据库中的 id 对应,Username 和数据库中的 username 对应,Age 和数据库中的 age 对应,Email 和数据库中的 email 对应,AddTime 和数据库中的 add_time 字段对应

3、默认情况表名是结构体名称的复数形式。如果我们的结构体名称定义成 User,表示这个模型默认操作的是 users 表。

4、我们可以使用结构体中的自定义方法 TableName 改变结构体的默认表名称,如下:

func (User) TableName() string {return "user"}

表示把 User 结构体默认操作的表改为 user 表

定义 user 模型:

package models
// 定义的结构体要和数据库的表名字一致,且里面的字段要和数据库的字段一致,且大写
type User struct { //默认情况表名是结构体名称的复数形式;比如这个就是操作的表为usersId       intUsername stringAge      intEmail    stringAddTime  int
}// TableName 表示配置操作数据库的表名称
func (user User) TableName() string {return "user"
}

我们准备测试的数据库:

 4、全部查找以及按照条件查找

我们依旧使用之前的模块隔离的形式,使用之前的useraddcontroller.go控制器,以及adminrouter.go路由

adminrouter.go:

package routersimport ("gindemo04/controllers/admin""gindemo04/middle""github.com/gin-gonic/gin"
)func AdminRoutersInit(r *gin.Engine) {//middlewares.InitMiddleware中间件adminRouters := r.Group("/admin", middle.InitMiddleware){adminRouters.GET("/", admin.IndexController{}.Index)adminRouters.GET("/user", admin.UserAddController{}.Index)adminRouters.GET("/user/add", admin.UserAddController{}.Add)adminRouters.GET("/user/edit", admin.UserAddController{}.Edit)adminRouters.GET("/user/delete", admin.UserAddController{}.Delete)}
}

package adminimport ("fmt""gindemo04/models""net/http""os""path""strconv""github.com/gin-gonic/gin"
)type UserAddController struct {BaseController
}func (con UserAddController) Index(c *gin.Context) {// 1、查询数据库userList := []models.User{}// FIND方法可以获取表内数据,然后赋值给userlist(切片)models.DB.Find(&userList) c.JSON(http.StatusOK, gin.H{"result" : userList,})
}

这段代码是使用 Golang 中的 Gin 框架和 GORM 库从数据库中检索用户数据并将其作为 JSON 响应返回。

1. `userList := []models.User{}`: 在这一行中,定义了一个空的 `userList` 切片,用于存储从数据库中检索到的用户数据。

2. `models.DB.Find(&userList)`: 这一行代码使用 GORM 库中的 `Find` 方法从数据库中检索用户数据,并将结果存储到 `userList` 中。`models.DB` 表示之前连接到数据库的 GORM 对象,`.Find` 方法用于执行查询操作,`&userList` 传递了切片的指针,以便查询结果可以被存储到切片中。

3. `c.JSON(http.StatusOK, gin.H{"result" : userList})`: 最后一行代码使用 Gin 框架中的 `c.JSON` 方法将查询结果作为 JSON 格式的响应返回。`http.StatusOK` 表示 HTTP 状态码为 200,`gin.H{"result" : userList}` 创建了一个包含查询结果的 JSON 对象,其中键为 "result",值为查询到的用户列表。

从数据库中检索用户数据,将其作为 JSON 格式的响应返回给客户端。

 

按照条件查找

查找年龄大于10的

package adminimport ("fmt""gindemo04/models""net/http""os""path""strconv""github.com/gin-gonic/gin"
)type UserAddController struct {BaseController
}func (con UserAddController) Index(c *gin.Context) {// 2、按照条件进行查找(age>10)userList := []models.User{}models.DB.Where("age > ?",10).Find(&userList)c.JSON(http.StatusOK, gin.H{"result" : userList,})}

1. `userList := []models.User{}`: 在这一行中,定义了一个空的 `userList` 切片,用于存储从数据库中检索到的用户数据。

2. `models.DB.Where("age > ?",10).Find(&userList)`: 这一行代码使用 GORM 库中的 `Where` 方法指定了筛选条件,即年龄大于 10,然后使用 `Find` 方法从数据库中检索符合条件的用户数据,并将结果存储到 `userList` 中。`models.DB` 表示之前连接到数据库的 GORM 对象,`.Where("age > ?",10)` 指定了筛选条件,`Find` 方法用于执行查询操作,`&userList` 传递了切片的指针,以便查询结果可以被存储到切片中。

3. `c.JSON(http.StatusOK, gin.H{"result" : userList})`: 最后一行代码使用 Gin 框架中的 `c.JSON` 方法将查询结果作为 JSON 格式的响应返回。`http.StatusOK` 表示 HTTP 状态码为 200,`gin.H{"result" : userList}` 创建了一个包含查询结果的 JSON 对象,其中键为 "result",值为查询到的用户列表。

 

5、添加数据操作

实例化按照结构体内的数据

package adminimport ("fmt""gindemo04/models""net/http""os""path""strconv""github.com/gin-gonic/gin"
)type UserAddController struct {BaseController
}func (con UserAddController) Add(c *gin.Context) {// c.HTML(http.StatusOK, "admin/useradd.html", gin.H{})// //3、增加数据user := models.User{Id: 7,Username: "芭乐",Age: 19,Email: "12213@qq.com",AddTime: int(models.GetUnix()),}// 将数据插入到数据库中models.DB.Create(&user)c.JSON(http.StatusOK, gin.H{"result" : "添加成功",})
}

6、更新数据(save)

查询 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.icon-default.png?t=N7T8https://gorm.io/zh_CN/docs/query.html

package adminimport ("fmt""gindemo04/models""net/http""os""path""strconv""github.com/gin-gonic/gin"
)type UserAddController struct {BaseController
}}
func (con UserAddController) Edit(c *gin.Context) {
// 	//6、更新数据//6.1查询id=5的数据user := models.User{Id: 5}models.DB.Find(&user)fmt.Println(user)c.JSON(http.StatusOK, gin.H{"result" : user,
})
// 	//6.2更新数据(sava表示保存所有数据)user.Username = "莫比---1"models.DB.Save(&user)c.JSON(http.StatusOK, gin.H{"result" : "修改成功",})
}

 

更新操作的单列形式

package adminimport ("fmt""gindemo04/models""net/http""os""path""strconv""github.com/gin-gonic/gin"
)type UserAddController struct {BaseController
}func (con UserAddController) Edit(c *gin.Context) {user := models.User{}//id=? 这是占位符models.DB.Model(&user).Where("id = ?", 5).Update("username", "莫比")c.JSON(http.StatusOK, gin.H{"result" : "修改成功",})
}

 

 7、删除操作

where后面跟的字段要和数据库内字段匹配,而上面的修改操作需要和定义的结构体自动匹配,两个不一样

package adminimport ("fmt""gindemo04/models""net/http""os""path""strconv""github.com/gin-gonic/gin"
)type UserAddController struct {BaseController
}
func (con UserAddController) Delete(c *gin.Context) {//8、进行删除操作(where后面跟的字段要和数据库内字段匹配,而上面的修改操作需要和定义的结构体自动匹配,两个不一样)user := models.User{}models.DB.Where("id = ?", 5).Delete(&user)c.JSON(http.StatusOK, gin.H{"result" : "删除成功",})}

 

 

相关文章:

Gin之GORM 操作数据库(MySQL)

GORM 简单介绍 GORM 是 Golang 的一个 orm 框架。简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。使用 ORM框架可以让我们更方便…...

二十七、读写文件

二十七、读写文件 27.1 文件类QFile #include <QCoreApplication>#include<QFile> #include<QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QFile file("D:/main.txt");if(!file.open(QIODevice::WriteOnly | QIODe…...

flutter 代码混淆

Flutter 应用混淆&#xff1a; Flutter 应用的混淆非常简单&#xff0c;只需要在构建 release 版应用时结合使用 --obfuscate 和 --split-debug-info 这两个参数即可。 –obfuscate --split-debug-info 用来指定输出调试文件的位置&#xff0c;该命令会生成一个符号映射表。目前…...

05 Vue中常用的指令

概述 All Vue-based directives start with a v-* prefix as a Vue-specific attribute. 所有基于 Vue 的指令都以 v-* 前缀作为 Vue 特有的属性。 v-text The v-text directive has the same reactivity as with interpolation. Interpolation with {{ }} is more perform…...

Mr. Cappuccino的第67杯咖啡——MacOS通过PD安装Win11

MacOS通过PD安装Win11 下载ParallelsDesktop安装ParallelsDesktop激活ParallelsDesktop下载Windows11安装Windows11激活Windows11 下载ParallelsDesktop ParallelsDesktop下载地址 安装ParallelsDesktop 关闭上面的窗口&#xff0c;继续操作 激活ParallelsDesktop 关闭上面的…...

【云原生kubernets】Service 的功能与应用

一、Service介绍 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也就意味着不方便直接采用pod的ip对服务进行访问。为了解决这个问题&#xff0c;kubernetes提供了Service资…...

docker安装Prometheus

docker安装Prometheus Docker搭建Prometheus监控系统 环境准备(这里的环境和版本是经过测试没有问题,并不是必须这个版本) 主机名IP配置系统说明localhost随意2核4gCentOS7或者Ubuntu20.0.4docker版本23.0.1或者24.0.5,docker-compose版本1.29 安装Docker Ubuntu20.0.4版本…...

了解 Flutter 3.16 功能更新

作者 / Kevin Chisholm 我们在季度 Flutter 稳定版发布会上带来了 Flutter 3.16&#xff0c;此版本包含诸多更新: Material 3 成为新的默认主题、为 Android 带来 Impeller 的预览版、允许添加适用于 DevTools 的扩展程序等等&#xff0c;以及同步推出 Flutter 休闲游戏工具包重…...

python之画动态图 gif效果图

import pandas as pd import matplotlib import matplotlib.pyplot as plt import os# set up matplotlib is_ipython inline in matplotlib.get_backend() if is_ipython:from IPython import displayplt.ion()def find_csv_files(directory):csv_files [] # 用于存储找到的…...

【JavaWeb】用注解代替配置文件

WebServlet("/query") public class QueryServlet extends HttpServlet {...}在Servlet类上写WebServlet("query"),就相当于在配置文件里写了↓ <servlet><servlet-name>query</servlet-name><servlet-class>QueryServlet</se…...

SpringBoot 3.0 升级之 Swagger 升级

文章目录 SpringFox3.0.0openapi3Swagger 注解迁移ApiApiOperationApiImplicitParamApiModelApiModelProperty 最近想尝试一下最新的 SpringBoot 项目&#xff0c;于是将自己的开源项目进行了一些升级。 JDK 版本从 JDK8 升级至 JDK17。SpringBoot 版本从 SpringBoot 2.7.3 升…...

AR游戏开发

增强现实&#xff08;Augmented Reality&#xff0c;AR&#xff09;游戏是一种整合了虚拟和现实元素的游戏体验。玩家通过使用AR设备&#xff08;如智能手机、AR眼镜或平板电脑&#xff09;来与真实世界互动&#xff0c;游戏中的数字内容与真实环境相结合。以下是一些关于AR游戏…...

Easy Excel生成复杂下Excel模板(下拉框)给用户下载

引言 文件的下载是一个非常常见的功能&#xff0c;也有一些非常好的框架可以使用&#xff0c;这里我们就介绍一种比较常见的场景&#xff0c;下载Excel模版&#xff0c;导入功能通常会配有一个模版下载的功能&#xff0c;根据下载的模版&#xff0c;填充数据然后再上传。 需求…...

基于EasyExcel的数据导入导出

前言&#xff1a; 代码复制粘贴即可用&#xff0c;主要包含的功能有Excel模板下载、基于Excel数据导入、Excel数据导出。 根据实际情况修改一些细节即可&#xff0c;最后有结果展示&#xff0c;可以先看下结果&#xff0c;是否是您想要的。 台上一分钟&#xff0c;台下60秒&a…...

电子学会C/C++编程等级考试2021年06月(六级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:逆波兰表达式 逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* +…...

智能优化算法应用:基于供需算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于供需算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于供需算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.供需算法4.实验参数设定5.算法结果6.参考文献7.MA…...

vue3 setup语法糖写法基本教程

前言 官网地址&#xff1a;Vue.js - 渐进式 JavaScript 框架 | Vue.js (vuejs.org)下面只讲Vue3与Vue2有差异的地方&#xff0c;一些相同的地方我会忽略或者一笔带过与Vue3一同出来的还有Vite&#xff0c;但是现在不使用它&#xff0c;等以后会有单独的教程使用。目前仍旧使用v…...

利用两个指针的差值求字符串长度

指针和指针也可以相加减&#xff0c;例如定义一个一维数组arr[10]&#xff1b;再定义一个指针&#xff08;int *p&#xff09;指向数组首元素的地址&#xff0c;定义一个指针&#xff08;int* q&#xff09;指向数组最后一个元素的地址&#xff0c;那么q-p的结果就是整个数组的…...

ping命令的工作原理

ping&#xff0c;Packet Internet Groper&#xff0c;是一种因特网包探索器&#xff0c;用于测试网络连接量的程序。Ping 是工作在 TCP/IP 网络体系结构中应用层的一个服务命令&#xff0c; 主要是向特定的目的主机发送 ICMP&#xff08;Internet Control Message Protocol 因特…...

谷歌的开源供应链安全

本内容是对Go项目负责人Russ Cox 在 ACM SCORED 活动上演讲内容[1]的摘录与整理。 SCORED 是Software Supply Chain Offensive Research and Ecosystem Defenses的简称, SCORED 23[2]于2023年11月30日在丹麦哥本哈根及远程参会形式举行。 摘要 &#x1f4a1; 谷歌在开源软件供应…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

HTML中各种标签的作用

一、HTML文件主要标签结构及说明 1. <&#xff01;DOCTYPE html> 作用&#xff1a;声明文档类型&#xff0c;告知浏览器这是 HTML5 文档。 必须&#xff1a;是。 2. <html lang“zh”>. </html> 作用&#xff1a;包裹整个网页内容&#xff0c;lang"z…...

C/Python/Go示例 | Socket Programing与RPC

Socket Programming介绍 Computer networking这个领域围绕着两台电脑或者同一台电脑内的不同进程之间的数据传输和信息交流&#xff0c;会涉及到许多有意思的话题&#xff0c;诸如怎么确保对方能收到信息&#xff0c;怎么应对数据丢失、被污染或者顺序混乱&#xff0c;怎么提高…...