【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导出 自动设置宽度,设置标题框,设置数据边框。 excel导出 添加依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.2</version></dependency>…...
唯一值校验的实现思路(续)
本文接着上一篇文章《唯一值校验的实现思路》,在后端实现唯一值校验。用代码实现。 /*** checkUniqueException[唯一值校验]** param entity 新增或编辑的学生实体* param insert 是否新增,如果是传入true;反之传入false* return void* date…...
ffmpeg基本用法
一、用法 ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... 说明: global options:全局选项,应用于整个 FFmpeg 进程,它们通常不受输入或输出部分的限制。 infile options:输入选…...
MYSQL第四次
目录 题目分析 代码实现 一、修改 Student 表中年龄(sage)字段属性,数据类型由 int 改变为 smallint 二、为 Course 表中 Cno 字段设置索引,并查看索引 三、为 SC 表建立按学号(sno)和课程号ÿ…...
联德胜w801开发板(六)手机蓝牙设置wifi名称和密码
一、概述 W801 是一款集成了 Wi-Fi 和蓝牙功能的芯片,本文将介绍如何利用 W801 的蓝牙功能,实现手机 APP 通过蓝牙配置 W801 连接的 Wi-Fi 名称和密码(即配网功能)。 二、文档查看: demo使用手册这里很清楚…...
Linux:库
目录 静态库 动态库 目标文件 ELF文件 ELF形成可执行 ELF可执行加载 ELF加载 全局偏移量表GOT(global offset table) 库是写好的,成熟的,可以复用的代码 现实中每个程序都要依赖很多的基础的底层库,不可能都是从零开始的 库有两种…...
向量数据库简单对比
文章目录 一、Chroma二、Pinecone/腾讯云VectorDB/VikingDB三、redis四、Elasticsearch五、Milvus六、Qdrant七、Weaviate八、Faiss 一、Chroma 官方地址: https://www.trychroma.com/优点 ①简单,非常简单构建服务。 ②此外,Chroma还具有自…...
大模型基本原理(四)——如何武装ChatGPT
传统的LLM存在几个短板:编造事实、计算不准确、数据过时等,为了应对这几个问题,可以借助一些外部工具或数据把AI武装起来。 实现这一思路的框架包括RAG、PAL、ReAct。 1、RAG(检索增强生成) LLM生成的内容会受到训练…...
从零开始:使用Jenkins实现高效自动化部署
在这篇文章中我们将深入探讨如何通过Jenkins构建高效的自动化部署流水线,帮助团队实现从代码提交到生产环境部署的全流程自动化。无论你是Jenkins新手还是有一定经验的开发者,这篇文章都会为你提供实用的技巧和最佳实践,助你在项目部署中走得…...
Spring Cloud工程完善
目录 完善订单服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 完成商品服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 远程调用 需求 实现 1.定义RestTemplate 2.修改order-service中的OrderService 测试运行 Rest…...
SSM仓库物品管理系统 附带详细运行指导视频
文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.用户登录代码:2.保存物品信息代码:3.删除仓库信息代码: 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SSM框架开发的仓库…...
3步解锁Windows运行安卓应用:APK-Installer轻量解决方案
3步解锁Windows运行安卓应用:APK-Installer轻量解决方案 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在数字化办公与娱乐融合的今天,安卓应用…...
AI推动SEO关键词优化的全新策略与实践明晰
在当前数字营销环境中,AI技术为SEO关键词优化带来了前所未有的变革。它通过自动化的数据分析与挖掘工具,能够帮助企业更准确地识别用户需求与搜索趋势。通过AI的支持,关键词挖掘变得更加高效和精准,企业可以快速获取相关关键词并优…...
别再折腾了!保姆级AirSim+UE5.3安装配置指南(附常见编译错误解决)
AirSim与虚幻引擎5.3深度整合:从零搭建自动驾驶仿真环境的完整实践 在自动驾驶技术快速发展的今天,仿真环境已成为算法开发与测试不可或缺的一环。微软开源的AirSim作为一个高度逼真的仿真平台,与虚幻引擎5.3的结合为开发者提供了前所未有的视…...
springboot+vue基于web的宠物商城领养网站的设计与实现
目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析技术实现要点特色功能扩展安全与性能项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块分析 用户模块 注册与登录&#…...
5分钟搞定RetroArch缩略图:从黑屏到完美游戏封面的全攻略
5分钟搞定RetroArch缩略图:从黑屏到完美游戏封面的全攻略 【免费下载链接】RetroArch Cross-platform, sophisticated frontend for the libretro API. Licensed GPLv3. 项目地址: https://gitcode.com/GitHub_Trending/re/RetroArch 还记得打开RetroArch游戏…...
基于宝塔面板与Docker Compose快速部署Dify最新版实战指南
1. 为什么选择宝塔Docker Compose部署Dify? 最近在帮几个创业团队搭建AI开发环境时,发现很多小伙伴都被复杂的部署流程劝退。传统的手动部署方式需要逐个安装Python、Redis、PostgreSQL等依赖,光是版本兼容问题就能折腾大半天。直到上个月我…...
CSS动画+超级千问:打造有呼吸感的语音合成反馈系统(实战教程)
CSS动画超级千问:打造有呼吸感的语音合成反馈系统(实战教程) 1. 项目介绍与核心价值 1.1 传统TTS工具的痛点 大多数语音合成工具的操作体验是这样的:面对一堆参数滑块,反复调整"语速"、"音高"、…...
Android USB串口通信终极指南:智能家居物联网项目实战
Android USB串口通信终极指南:智能家居物联网项目实战 【免费下载链接】usb-serial-for-android Android USB host serial driver library for CDC, FTDI, Arduino and other devices. 项目地址: https://gitcode.com/gh_mirrors/us/usb-serial-for-android …...
半导体制造中的ProcessJob与Control Job:从定义到实战避坑指南
半导体制造中的ProcessJob与Control Job:从定义到实战避坑指南 在半导体制造的高精度世界里,每一片晶圆的流转都像一场精密编排的交响乐。而ProcessJob(PJ)和Control Job(CJ)就是这场演奏中不可或缺的指挥…...
LangFlow零代码AI应用搭建:5分钟可视化构建智能问答机器人
LangFlow零代码AI应用搭建:5分钟可视化构建智能问答机器人 1. LangFlow简介:零代码AI应用构建利器 LangFlow是一款革命性的可视化AI应用构建工具,它让不懂编程的用户也能轻松搭建智能问答机器人。想象一下,你只需要像搭积木一样…...
