GoLang连接mysql数据库

news2024/11/25 12:35:30

跟着文档走
GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.

1.使用命令拉取
 

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

2.开始使用
 

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"net/http"
	"strconv"
	"time"
)

func main() {
	// 创建服务
	ginServer := gin.Default()

	// 连接mysql
	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	dsn := "root:zsp123456@tcp(127.0.0.1:3306)/zsp?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
		// 表明复数问题
		NamingStrategy: schema.NamingStrategy{SingularTable: true},
	})
	// 设置sql的一些属性
	sqlDB, err := db.DB()
	sqlDB.SetMaxIdleConns(10)
	sqlDB.SetMaxOpenConns(100)
	sqlDB.SetConnMaxLifetime(10 * time.Second) // 10s

	//结构体,就是创建表用的,包含了name,state,phone
	type List struct {
		// 主键id等信息
		gorm.Model
		Name  string `gorm:"type:varchar(20);not null" json:"name" binding:"required"`
		State int    `gorm:"type:int(10);not null" json:"state" binding:"required"`
		Phone string `gorm:"type:varchar(50);not null" json:"phone" binding:"required"`
	}
	// 数据库迁移
	db.AutoMigrate(&List{})

	// 以上就是准备工作,下面开始crud
	// CRUD
	// 增加
	ginServer.POST("/add", func(context *gin.Context) {
		var data List
		err := context.ShouldBindJSON(&data)
		// 判断绑定是否有错误
		if err != nil {
			context.JSON(http.StatusBadRequest, gin.H{"msg": "数据有误"})
		} else {
			// 数据库操作 增加一条数据
			db.Create(&data) // 创建一条数据
			context.JSON(http.StatusOK, gin.H{
				"msg":  "添加成功",
				"data": data,
				"code": http.StatusOK,
			})
		}
	})
	// 删除
	ginServer.DELETE("/delete/:id", func(context *gin.Context) {
		var data []List
		// 接收id
		id := context.Param("id")
		// 判断id是否存在
		db.Where("id = ?", id).Find(&data)
		// id存在则删除,不存在报错
		if len(data) == 0 {
			context.JSON(http.StatusOK, gin.H{
				"msg":  "删除失败",
				"code": http.StatusBadRequest,
			})
		} else {
			// 操作数据库删除
			db.Where("id = ?", id).Delete(&data)
			context.JSON(http.StatusOK, gin.H{
				"msg":  "删除成功",
				"code": http.StatusOK,
			})
		}
	})
	//修改
	ginServer.PUT("/edit/:id", func(context *gin.Context) {
		var data List
		// 接收id
		id := context.Param("id")
		// 判断id是否存在
		db.Select("id").Where("id = ?", id).Find(&data)

		// 判断id是否存在
		if data.ID == 0 {
			context.JSON(http.StatusBadRequest, gin.H{
				"msg": "用户id没有找到",
			})
		} else {
			err := context.ShouldBindJSON(&data)
			if err != nil {
				context.JSON(http.StatusBadRequest, gin.H{
					"msg": "修改失败",
				})
			} else {
				//db修改数据库
				db.Where("id = ?", id).Updates(&data)
				context.JSON(http.StatusOK, gin.H{
					"msg": "修改成功",
				})
			}
		}

	})
	// 查询(条件查询,全部查询/分页查询)
	//条件查询
	ginServer.GET("/list/:name", func(context *gin.Context) {
		//获取路径参数
		name := context.Param("name")
		var data []List
		// 查询数据库是否存在
		db.Where("name = ?", name).Find(&data)

		// 判断是否查询到数据
		if len(data) == 0 {
			context.JSON(http.StatusBadRequest, gin.H{
				"msg": "没有查询到数据",
			})
		} else {
			context.JSON(http.StatusOK, gin.H{
				"msg":  "查询成功",
				"data": data,
			})
		}
	})

	// 分页查询
	ginServer.GET("/list", func(context *gin.Context) {
		var pageList []List
		// 1.查询全部数据、查询分页数据
		pageSize, _ := strconv.Atoi(context.Query("pageSize"))
		pageNum, _ := strconv.Atoi(context.Query("pageNum"))
		// 判断是否需要分页
		if pageSize == 0 {
			pageSize = -1
		}
		if pageNum == 0 {
			pageNum = -1
		}
		offsetVal := (pageNum - 1) * pageSize
		if pageNum == -1 && pageSize == -1 {
			offsetVal = -1
		}
		// 返回一个总数
		var total int64
		// 查询数据库
		// limit 分页 -1:查询全部数据
		db.Model(pageList).Count(&total).Limit(pageSize).Offset(offsetVal).Find(&pageList)
		if len(pageList) == 0 {
			context.JSON(http.StatusBadRequest, gin.H{
				"msg": "暂无数据",
			})
		} else {
			context.JSON(http.StatusOK, gin.H{
				"msg": "查询成功",
				"data": gin.H{
					"list":     pageList,
					"total":    total,
					"pageNum":  pageNum,
					"pageSize": pageSize,
				},
				"code": http.StatusOK,
			})
		}

	})

	//启动服务
	err = ginServer.Run(":8082")
	if err != nil {
		return
	}
}

构造体创建出来的表

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

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

相关文章

什么是SRE?它与 DevOps 有何关系?

SRE 代表站点可靠性工程。它建立在DevOps 原则之上,为 IT 运营带来工程主导的方法。SRE 使用软件来自动化系统操作、识别问题并实施解决方案。 SRE 的概念是在 Google 开发的。它基于这样的理念:代码和软件是管理大型系统的最有效方法。由单独团队启动的手动程序存在监督和不…

智能网关IOT 2050采集应用

SIMATIC IOT2050 是西门子公司新推出的应用于企业数字化转型的智能边缘计算和云连接网关。 它将云、公司内 IT 和生产连接在一起,专为直接在生产环境中获取、处理和传输数据的工业 IT 解 决方案而设计。例如,它可用于将生产 过程与基于云的机器和生产数据…

项目和1013

这里写目录标题 项目采用Nginx做反向代理、以及搭建Tomcat服务器集群,实现负载均衡和动静分离4.34.7相关的八股 动静分离4.125-4 Redis集中式缓存商品详情页5-7 开启本地缓存5-11 开启本地缓存 采用RabbitMQ实现异步消息扣减数据库内库存7-4 同步进缓存,…

java生成自定义长度的唯一随机字符串

思路 基于唯一数字,再随机指向ASCII码的大小写字母的编码值实现随机,唯一数字可以由redis自增或者雪花id等生成。实现代码 /*** description: 生成10个字符的唯一随机字符串,由数字大小写字母组成* date 15:58 2023/10/13* param increment…

C++ - git 命令行

为什么要有 git 你很可能遇到过这种情况,在写项目的时候,要我不符合 leader 的要求,因而修改了很多个版本,但是修改到最后一版的时候,leader 有觉得当前这版还没有之前 某一版好,现在又要求你在 之前的那一…

Fbank及MFCC学习

Fbank:FilterBank:人耳对声音频谱的响应是非线性的,Fbank就是一种前端处理算法,以类似于人耳的方式对音频进行处理,可以提高语音识别的性能。获得语音信号的fbank特征的一般步骤是:预加重、分帧、加窗、短时…

【嵌入式开发学习01】Arduino安装esp32-cam以及CameraWebServer实例的实现

目录 1. 硬件2. 软件2.1 arduino下载安装2.2 arduino配置esp32-cam开发板文件2.3 下载相应版本的esp32 3. ESP32-CAM实例:CameraWebServer3.1 选择开发板3.2 选择示例代码进行验证3.3 烧录进行实测 1. 硬件 没买下载主板的可使用usb转串口模块进行烧录,接…

LeetCode【73】矩阵置零

题目: 思路: 1、从题目看,在遍历数组的同时,如果遍历到0,回溯i,j,将其对应的行列变为0。不能变更后面的,后面遍历整个数组都将变成0. 2、需要额外的空间存储要变0的标记位&#xf…

高通推出骁龙X系列进军PC平台

今日,高通在官方博客发布了由高级副总裁兼首席营销官莫珂东(Don McGuire)署名的一篇文章,正式揭晓了一款全新的芯片系列:骁龙X系列。该款芯片专为下一代PC体验打造。高通表示,2024年将会是PC行业的一个拐点…

OJ项目——统一数据格式返回,我是如何处理的?

目录 前言 OJ项目中是如何处理的 1、准备一个类,作为统一的数据返回格式 2、准备一个类,实现ResponseBodyAdvice接口 3、我们如何写返回值更好 4、进一步优化返回值 小结 前言 关于SpringBoot的同一功能处理,本博主在这篇博客已经有介…

Linux 系统中提供CPU性能分析工具整理

Linux 系统中提供CPU性能分析工具整理 汇总 查看CPU信息 在linux操作系统中,CPU的信息在启动的过程中被装载到虚拟目录/proc下的cpuinfo文件中,我们可以通过 cat /proc/cpuinfo 查看一下: cat /proc/cpuinfo显示如下: rootthe…

docker创建elasticsearch、elasticsearch-head部署及简单操作

elasticsearch部署 1 拉取elasticsearch镜像 docker pull elasticsearch:7.7.0 2 创建文件映射路径 mkdir /mydata/elasticsearch/data mkdir /mydata/elasticsearch/plugins mkdir /mydata/elasticsearch/config 3 文件夹授权 chmod 777 /mydata/elastic…

详解cv2.addWeighted函数【使用 OpenCV 添加(混合)两个图像-Python版本】

文章目录 简介函数原型代码示例参考资料 简介 有的时候我们需要将两张图片在alpha通道进行混合,比如深度学习数据集增强方式MixUp。OpenCV的addWeighted提供了相关操作,瓷片博客将详细介绍这个函数,并给出代码示例。🚀&#x1f6…

有外媒称,Linux 发行版Ubuntu 23.10也将正式支持树莓派 5

据了解,在树莓派 4 单板计算机推出 4年后,树莓派 5也在上月末正式发布,并且两者对比之后可以发现,树莓派 5主要提升性能是添加了对 PCIe 2.0的支持。 Multiable万达宝医疗ERP(www.multiable.com.cn/solutions_yl)具备严格的保质期…

搭建vue后台管理系统框架

第一步:创建vue项目vue create 项目名称,并安装element-ui Vue CLI v3.1.3 ? Please pick a preset: Manually select features ? Check the features needed for your project: Babel, Router, CSS Pre-processors, Linter 1、是否使用history模式的…

【Express】静态资源

通过 Express 内置的 express.static 可以方便地托管静态文件,例如图片、CSS、JavaScript 文件等。 将静态资源文件所在的目录作为参数传递给 express.static 中间件就可以提供静态资源文件的访问了。 // 配置静态资源 app.use(express.static(public)); app.use(…

条件表达式

1.语法: 如果写范围,case不用写字段名 内容:case 字段名 when 值/或者值的范围 then 转化成的值 as 列名 end 语义:选择转换后新起一列 as不写默认text 2.其他用法: 2.1.计次 count(...)…

Master PDF Editor v5.9.70便携版

软件介绍 Master PDF Editor中文版是一款小巧的多功能PDF编辑器,可以轻松查看,创建,修改,批注,签名,扫描,OCR和打印PDF文档.高级注释工具,可以添加任意便笺指示对象突出显示,添加下划线和删除,而无需更改源PDF文件. 软件截图 更新日志 code-industry.net/what-is-new-in-mas…

【原创】在Linux上安装Zabbix客户端

检查Linux版本 cat /etc/issue得到结果 Ubuntu 18.04.2 LTS \n \l 下载软件 到 Zabbix官网(https://www.zabbix.com/) 依次点击 Download>Zabbix Packages>Choose your platform>ZABBIX VERSION>6.4>OS DISTRIBUTION>Ubuntu>OS …

[科研琐事] 安装服务器到机柜的二三事

1. 机柜参数 宽度:一般机器都是符合的; 深度:对应服务器最长的那个边; 厚度(高度):1/2/3/4U,就是机柜上写的刻度数字,1U1.75英寸。 1U4.45cm 2U4.45cm * 2 3U4.45cm * …