当前位置: 首页 > 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框架开发的仓库…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Netty从入门到进阶(二)

二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架&#xff0c;用于…...