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

【Golang学习之旅】Go + MySQL 数据库操作详解

文章目录

    • 前言
    • 1. GORM简介
    • 2. 安装GORM并连接MySQL
      • 2.1 安装GORM和MySQL驱动
      • 2.2 连接MySQL
    • 3. GORM数据模型(Model)
      • 3.1 定义User结构体
      • 3.2 自动迁移(AutoMigrate)
    • 4. GORM CRUD 操作
      • 4.1 插入数据(Create)
      • 4.2 查询数据(Read)
      • 4.3 更新数据(Update)
      • 4.4 删除数据(Delete)
    • 5. 进阶功能:事务 & 关联关系
      • 5.1 事务操作
    • 6. GORM 性能优化
      • 6.1 添加索引
      • 6.2 批量插入
    • 🎯 总结

前言

✅ 适合人群:Go 后端开发者 | 数据库开发者 | 想掌握 GORM 的工程师
✅ 文章亮点:从 安装、基础操作、CRUD、事务、索引优化 到 进阶技巧,全面解析 GORM
✅ 目标:掌握 Go 语言 + MySQL(GORM),开发高效数据库应用!

1. GORM简介

GORM是Go语言最流行的ORM框架,它提供了一套强大且简介的数据库操作API,相比database/sql,它具备以下优势:
✅ 代码简洁:无需手写 SQL,使用链式调用
✅ 支持自动迁移:可自动创建和更新数据库表结构
✅ 支持事务、预加载、钩子函数
✅ 支持多种数据库(MySQL、PostgreSQL、SQLite、SQL Server)
✅ 支持软删除、乐观锁、索引管理

2. 安装GORM并连接MySQL

2.1 安装GORM和MySQL驱动

执行以下命令安装 GORM 和 MySQL 依赖:

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

2.2 连接MySQL

main.go中编写数据库连接代码:

package mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)
var DB *gorm.DB  // 全局数据库实例func InitDB() {dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"var err errorDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic("数据库连接失败:" + err.Error())}fmt.Println("数据库连接成功!")
}func main() {InitDB()
}

📌 替换 root:password 为你的 MySQL 账号密码,testdb 为数据库名称
📌 确保 MySQL 服务已开启,并且testdb数据库已存在

3. GORM数据模型(Model)

GORM的模型(Model)类似于数据库中的表,每个字段对应表的列。

3.1 定义User结构体

type User struct {ID uint `gorm:"primaryKey"`  // 主键Name string `gorm:"size:100"`  // 名字,最大100字符Age int  // 年龄Email string `gorm:"unique"`  // 邮箱,唯一约束CreateAt time.Time
}

3.2 自动迁移(AutoMigrate)

GORM支持自动迁移,可以自动创建表结构。

package mainimport ("fmt""time""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {ID       uint   `gorm:"primaryKey"` // 主键Name     string `gorm:"size:100"`   // 名字,最大100字符Age      int    // 年龄Email    string `gorm:"unique"` // 邮箱,唯一约束CreateAt time.Time
}var DB *gorm.DBfunc InitDB() {dsn := "root:password@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"var err errorDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic("❌ 数据库连接失败:" + err.Error())}fmt.Println("✅ 数据库连接成功!")
}func Migrate() {err := DB.AutoMigrate(&User{}) // 自动迁移User表if err != nil {fmt.Println("数据库迁移失败:", err)}else {fmt.Println("数据库迁移成功!")}
}func main() {InitDB()Migrate()
}

📌 运行 go run main.go,会自动创建 users 表! 🚀

4. GORM CRUD 操作

4.1 插入数据(Create)

package mainimport ("fmt""time""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {ID       uint   `gorm:"primaryKey"` // 主键Name     string `gorm:"size:100"`   // 名字,最大100字符Age      int    // 年龄Email    string `gorm:"unique"` // 邮箱,唯一约束CreateAt time.Time
}var DB *gorm.DBfunc InitDB() {dsn := "root:123456@tcp(127.0.0.1:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"var err errorDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic("❌ 数据库连接失败:" + err.Error())}fmt.Println("✅ 数据库连接成功!")
}func Migrate() {err := DB.AutoMigrate(&User{}) // 自动迁移User表if err != nil {fmt.Println("数据库迁移失败:", err)} else {fmt.Println("数据库迁移成功!")}
}func CreateUser() {user := User{Name: "Zhangsan", Age: 18, Email: "ponyma@tencent.com",CreateAt: time.Now()}result := DB.Create(&user)if result.Error != nil {fmt.Println("数据插入失败", result.Error)} else {fmt.Println("数据插入成功:", user)}
}func main() {InitDB()// Migrate()CreateUser()}

在这里插入图片描述

4.2 查询数据(Read)

func GetUserByID(id int) {var user Userresult := DB.First(&user, id)if result.Error != nil {fmt.Println("查询失败:",result.Error)}else {fmt.Println("查询成功:",user)}
}

在这里插入图片描述

4.3 更新数据(Update)

func UpdateUser(id int,newAge int) {result :=DB.Model(&User{}).Where("id = ?",id).Update("age",newAge)if result.Error != nil {fmt.Println("数据更新失败:", result.Error)}else {fmt.Println("数据更新成功:", result.RowsAffected,"行")}
}

在这里插入图片描述

4.4 删除数据(Delete)

func DeleteUser(id uint) {result := DB.Delete(&User{}, id)if result.Error != nil {fmt.Println("❌ 删除失败:", result.Error)} else {fmt.Println("✅ 删除成功:", result.RowsAffected, "行")}
}

在这里插入图片描述

5. 进阶功能:事务 & 关联关系

5.1 事务操作

func TransferFunds(senderID, receiverID uint, amount int) {tx := DB.Begin()  // 开启事务defer func() {if r := recover(); r != nil {tx.Rollback()  // 事务回滚}}()sender := User{}receiver := User{}if err := tx.First(&sender, senderID).Error; err != nil {tx.Rollback()return}if err := tx.First(&receiver, receiverID).Error; err != nil {tx.Rollback()return}// 模拟扣款sender.Age -= amountreceiver.Age += amountif err := tx.Save(&sender).Error; err != nil {tx.Rollback()return}if err := tx.Save(&receiver).Error; err != nil {tx.Rollback()return}tx.Commit()  // 提交事务
}

6. GORM 性能优化

6.1 添加索引

type Product struct {ID       uint   `gorm:"primaryKey"`Name     string `gorm:"index"`  // 索引Price    float64
}

6.2 批量插入

func BatchInsertUsers(users []User) {DB.Create(&users)
}

🎯 总结

✅ 学习了 GORM 基础:安装、连接 MySQL、定义 Model
✅ 掌握了 CRUD 操作:插入、查询、更新、删除
✅ 实现了事务操作,防止数据不一致
✅ 了解了索引优化 & 性能优化

🔥 现在,你已经掌握了 Go + MySQL(GORM)的完整开发流程! 🚀

相关文章:

【Golang学习之旅】Go + MySQL 数据库操作详解

文章目录 前言1. GORM简介2. 安装GORM并连接MySQL2.1 安装GORM和MySQL驱动2.2 连接MySQL 3. GORM数据模型(Model)3.1 定义User结构体3.2 自动迁移(AutoMigrate) 4. GORM CRUD 操作4.1 插入数据(Create)4.2 …...

Http 的响应码有哪些? 分别代表的是什么?

HTTP 状态码分为多个类别,下面是常见的 HTTP 状态码及其含义,包括 3xx 重定向状态码的详细区别: 📌 HTTP 状态码分类 分类状态码范围说明1xx100-199信息性状态码,表示请求已被接收,继续处理2xx200-299成功…...

深入解析 Linux 系统中 Cron 定时任务的配置与管理

在 Linux 和类 Unix 系统中,cron 是一个非常强大的工具,用于定时执行各种任务,例如自动备份、定时运行脚本和定期清理日志文件。通过合理配置 cron,你可以让很多系统维护任务自动化,从而减轻日常管理的压力。而 cronta…...

关于 IoT DC3 中设备(Device)的理解

在物联网系统中,设备(Device)是一个非常宽泛的概念,它可以指代任何能够接入系统并进行数据交互的实体。包括但不限于手机、电脑、服务器、网关、硬件设备甚至是某些软件程序等所有能接入到该平台的媒介。 内容 定义 目的 示例 …...

golang 版 E签宝请求签名鉴权方式

E签宝 请求签名鉴权方式说明 package utilsimport ("crypto/hmac""crypto/md5""crypto/sha256""encoding/base64""fmt""github.com/gogf/gf/v2/util/gconv" )type Sign struct {secret string }func NewSign(sec…...

QTreeView和QTableView单元格添加超链接

QTreeView和QTableView单元格添加超链接的方法类似,本文仅以QTreeView为例。 在QTableView仿Excel表头排序和筛选中已经实现了超链接的添加,但是需要借助delegate,这里介绍一种更简单的方式,无需借助delegate。 一.效果 二.实现 QHTreeView.h #ifndef QHTREEVIEW_H #def…...

【WB 深度学习实验管理】使用 PyTorch Lightning 实现高效的图像分类实验跟踪

本文使用到的 Jupyter Notebook 可在GitHub仓库002文件夹找到,别忘了给仓库点个小心心~~~ https://github.com/LFF8888/FF-Studio-Resources 在机器学习项目中,实验跟踪和结果可视化是至关重要的环节。无论是调整超参数、优化模型架构,还是监…...

SSM开发(十一) mybatis关联关系多表查询(嵌套查询,举例说明)

目录 一、背景介绍 二、一对一查询(嵌套查询) 三、一对多查询(嵌套查询) 四、嵌套查询效率评估 注:关联查询则是指在一个查询中涉及到多个表的联合查询 一、背景介绍 当对数据库的操作涉及到多张表,这在面向对象语言如Java中就涉及到了对象与对象之间的关联关系。针对多…...

The Simulation技术浅析(六):机器学习

机器学习(Machine Learning)是模拟技术(The Simulation)的重要组成部分,通过从数据中自动学习规律和模式,机器学习能够提升模拟系统的智能化水平,增强其预测、决策和优化能力。 一、监督学习(Supervised Learning) 1. 基本原理 监督学习是指利用标注数据(即输入数…...

apache-poi导出excel数据

excel导出 自动设置宽度&#xff0c;设置标题框&#xff0c;设置数据边框。 excel导出 添加依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency>…...

唯一值校验的实现思路(续)

本文接着上一篇文章《唯一值校验的实现思路》&#xff0c;在后端实现唯一值校验。用代码实现。 /*** checkUniqueException[唯一值校验]** param entity 新增或编辑的学生实体* param insert 是否新增&#xff0c;如果是传入true&#xff1b;反之传入false* return void* date…...

ffmpeg基本用法

一、用法 ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... 说明&#xff1a; global options&#xff1a;全局选项&#xff0c;应用于整个 FFmpeg 进程&#xff0c;它们通常不受输入或输出部分的限制。 infile options&#xff1a;输入选…...

MYSQL第四次

目录 题目分析 代码实现 一、修改 Student 表中年龄&#xff08;sage&#xff09;字段属性&#xff0c;数据类型由 int 改变为 smallint 二、为 Course 表中 Cno 字段设置索引&#xff0c;并查看索引 三、为 SC 表建立按学号&#xff08;sno&#xff09;和课程号&#xff…...

联德胜w801开发板(六)手机蓝牙设置wifi名称和密码

一、概述 W801 是一款集成了 Wi-Fi 和蓝牙功能的芯片&#xff0c;本文将介绍如何利用 W801 的蓝牙功能&#xff0c;实现手机 APP 通过蓝牙配置 W801 连接的 Wi-Fi 名称和密码&#xff08;即配网功能&#xff09;。 二、文档查看&#xff1a; demo使用手册这里很清楚&#xf…...

Linux:库

目录 静态库 动态库 目标文件 ELF文件 ELF形成可执行 ELF可执行加载 ELF加载 全局偏移量表GOT(global offset table) 库是写好的&#xff0c;成熟的&#xff0c;可以复用的代码 现实中每个程序都要依赖很多的基础的底层库&#xff0c;不可能都是从零开始的 库有两种…...

向量数据库简单对比

文章目录 一、Chroma二、Pinecone/腾讯云VectorDB/VikingDB三、redis四、Elasticsearch五、Milvus六、Qdrant七、Weaviate八、Faiss 一、Chroma 官方地址&#xff1a; https://www.trychroma.com/优点 ①简单&#xff0c;非常简单构建服务。 ②此外&#xff0c;Chroma还具有自…...

大模型基本原理(四)——如何武装ChatGPT

传统的LLM存在几个短板&#xff1a;编造事实、计算不准确、数据过时等&#xff0c;为了应对这几个问题&#xff0c;可以借助一些外部工具或数据把AI武装起来。 实现这一思路的框架包括RAG、PAL、ReAct。 1、RAG&#xff08;检索增强生成&#xff09; LLM生成的内容会受到训练…...

从零开始:使用Jenkins实现高效自动化部署

在这篇文章中我们将深入探讨如何通过Jenkins构建高效的自动化部署流水线&#xff0c;帮助团队实现从代码提交到生产环境部署的全流程自动化。无论你是Jenkins新手还是有一定经验的开发者&#xff0c;这篇文章都会为你提供实用的技巧和最佳实践&#xff0c;助你在项目部署中走得…...

Spring Cloud工程完善

目录 完善订单服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 完成商品服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 远程调用 需求 实现 1.定义RestTemplate 2.修改order-service中的OrderService 测试运行 Rest…...

SSM仓库物品管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.用户登录代码&#xff1a;2.保存物品信息代码&#xff1a;3.删除仓库信息代码&#xff1a; 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SSM框架开发的仓库…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...