GoLang连接mysql数据库

跟着文档走
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 mainimport ("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,phonetype List struct {// 主键id等信息gorm.ModelName  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 Listerr := 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// 接收idid := 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// 接收idid := 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) * pageSizeif 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.mzph.cn/news/104750.shtml

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

相关文章

虚幻阴影整理

虚拟阴影贴图(VSM)是一种全新的阴影贴图方法,可以提供稳定的高分辨率阴影。通过与虚幻引擎5的Nanite虚拟几何体、Lumen全局光照和反射以及世界分区功能结合使用,它能够实现电影级的品质效果,为大型开放场景提供光照。 …

mysql case when 不命中缓存

case when 在sql 中非常方便数据不同维度统计,但是也会出现mysql 索引不命中问题,当多个case 出现时,需要提取出来到where里面优化 优化后 SELECT date(RecordTime) AS date, count( DISTINCT CASE WHEN Param 1 …

Java之TCP和UDP进行网络编程

目录 一.网络编程 1.1网络编程的作用 1.2网络编程的基本概念 1.3网络编程的实现 二.UDP网络编程 2.1UDP数据报套的初步了解 2.2Java数据报套接字通信模型 2.3Java编程实现UDP通信 三.TCP网络编程 3.1TCP流套接字api 3.2TCP通信代码实现 3.2.1短连接实现代码 3.…

钉钉数字校园小程序开发:开启智慧教育新时代

随着信息技术的快速发展和校园管理的日益复杂化,数字校园已成为现代教育的重要趋势。钉钉数字校园小程序作为一种创新应用,以其专业性、思考深度和逻辑性,为学校提供了全新的管理、教学和沟方式。本文从需求分析、技术实现和应用思考三个方面…

websocket逆向-protobuf序列化与反序列化

系列文章目录 训练地址:https://www.qiulianmao.com 基础-websocket逆向基础-http拦截基础-websocket拦截基础-base64编码与解码基础-protobuf序列化与反序列化视频号直播弹幕采集实战一:Http轮询更新中 websocket逆向-protobuf序列化与反序列化基础 系…

输入一段SQL,如何预估运行完该SQL,需要多长时间?需要多少资源?

预估SQL运行时间和资源需求是一个复杂的问题,需要考虑多个因素。以下是一些常见的预估方法: 使用SQL Explain 分析:通过使用SQL Explain 分析,可以分析SQL查询计划,了解SQL执行的具体过程和涉及的数据量,从…

Apipost连接数据库详解

Apipost提供了数据库连接功能,在接口调试时可以使用数据库获取入参或进行断言校验。目前的Apipost支持:Mysql、SQL Sever、Oracle、Clickhouse、达梦数据库、PostgreSQL、Redis、MongoDB 8种数据库的连接操作 新建数据库连接: 在「项目设置…

【Redis】使用Java客户端操作Redis

目录 引入jedis依赖连接Redis命令get/setexists/delkeysexpire/ttltype 引入jedis依赖 连接Redis 命令 get/set exists/del keys expire/ttl type

C++笔记之获取线程ID以及线程ID的用处

C笔记之获取线程ID以及线程ID的用处 code review! 文章目录 C笔记之获取线程ID以及线程ID的用处一.获取ID二.线程ID的用处2.1.线程池管理2.2.动态资源分配2.3.使用线程同步机制实现互斥访问共享资源2.4.使用线程 ID 辅助线程同步2.5.任务分发:线程ID可以用于将任务…

Qt 窗口与部署应用程序发布包 day6

Qt 窗口与部署应用程序发布包 day6 QWidget QWidget是所有可视控件的基类,每个控件都是矩形按照Z轴顺序排序如果控件没有父控件,则称为窗口 设置exe窗口图标 在项目文件中新建一个文件夹Resource,来存放图标文件 第一种方法 用绝对路…

UE4和C++ 开发--HUD类

HUD 平视显示器(Head Up Display),简称HUD。在蓝图中是指在屏幕上面绘制的二维物体。 1. 创建HUD 打开蓝图编辑器,创建一个蓝图类,搜索HUD,选择并命名BP_HUD。 2. 开始绘制 打开事件列表,右键搜索 EventReceive Draw HUD。有两…

微信picker弹出之后 , 背景变成灰色是怎么做的

微信小程序在弹出picker组件时&#xff0c;会将页面背景变为半透明的灰色&#xff0c;这是通过设置一个全屏的蒙层来实现的。 具体实现方法如下&#xff1a; 在WXML文件中&#xff0c;添加一个view元素作为蒙层&#xff0c;并设置其样式和属性&#xff1a; <view class&q…

互联网Java工程师面试题·Java 并发编程篇·第三弹

目录 26、什么是线程组&#xff0c;为什么在 Java 中不推荐使用&#xff1f; 27、为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f; 27.1 为什么要使用 Executor 线程池框架 27.2 使用 Executor 线程池框架的优点 28、java 中有几种方法可以实现一个线程…

【牛客网刷题(数据结构)】:环形链表的约瑟夫问题

描述 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是多少&#xff1f; O(n) 示例1 好环形链表的约瑟夫问题是一个经典的问…

分布式链路追踪如何跨线程

背景 我们希望实现全链路信息&#xff0c;但是代码中一般都会异步的线程处理。 解决思路 我们可以对以前的 Runable 和 Callable 进行增强。 可以使用 ali 已经存在的实现方式。 TransmittableThreadLocal (TTL) 解决异步执行时上下文传递的问题 核心的实现思路如下&#…

Vue_Bug NPM下载速度过慢

Bug描述&#xff1a; NPM下载速度过慢 解决方法&#xff1a; 将NPM的默认下载源换成国内镜像源 查看当前下载源的命令&#xff1a; npm config get registry换成淘宝镜像源的命令&#xff1a; npm config set registry https://registry.npmmirror.com/

微信小程序(小程序入门)

一&#xff0c;介绍 1、什么是小程序 小程序是一种轻量级的应用程序&#xff0c;可以在移动设备上运行&#xff0c;不需要用户下载和安装。它们通常由企业或开发者开发&#xff0c;用于提供特定功能或服务。 微信小程序&#xff08;wei xin xiao cheng xu&#xff09;&#xf…

O3DE社区发布2310.0版本

O3DE社区在今年10月10日发布了版本2310.0。 2310.0版本对应的代码标签&#xff0c;见链接。 直接下载标签2310.0对应的源码&#xff0c;命令如下&#xff1a; git clone https://github.com/o3de/o3de.git -b 2310.0或者本地已经clone过项目&#xff0c;可以通过切换分支的方…

easyUI重新渲染

问题 使用Easyui 时&#xff0c;动态后添加的元素样式无法生效。 解决颁发 全页面重新渲染 $.parser.parse();单一元素重新渲染 var obj $("#div1").append("<input classeasyui-textbox typetext>"); $.parser.parse(obj);

NPM相关命令

临时使用 npm --registry https://registry.npm.taobao.org install 包名2.永久设置为淘宝镜像 npm config set registry https://registry.npm.taobao.org3.换回国外官方源 npm config set registry https://registry.npmjs.org4.查看使用的源地址 npm config get registr…