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

手把手教你学Simulink——基于Simulink的模型预测控制(MPC)PFC整流器快速动态响应

目录 手把手教你学Simulink ——基于Simulink的模型预测控制(MPC)PFC整流器快速动态响应 一、问题背景 二、系统建模与控制目标 1. 单相 Boost PFC 拓扑 2. 动态方程(αβ 静止坐标系) 3. 控制目标 三、有限控制集 MPC(FCS-MPC)设计 1. 预测模型(离散化) 2. 代…...

Czkawka:用Rust构建的开源存储清理工具全解析

Czkawka&#xff1a;用Rust构建的开源存储清理工具全解析 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 一、场景痛点&#xff1a;当代存储管理的…...

StructBERT WebUI部署教程:CSDN GPU Pod环境下5000端口服务配置与防火墙适配

StructBERT WebUI部署教程&#xff1a;CSDN GPU Pod环境下5000端口服务配置与防火墙适配 1. 项目概述 StructBERT文本相似度服务是一个基于百度StructBERT大模型的高精度中文句子相似度计算工具。这个工具能够准确判断两个中文句子在语义上的相似程度&#xff0c;为各种文本处…...

基于摄像头和网络的火灾监测系统开源项目推荐

推荐的开源项目 基于YOLOv10的火焰烟雾检测系统&#xff08;最推荐&#xff09; 特点&#xff1a;支持图像、视频和摄像头实时检测&#xff0c;提供完整的GUI界面&#xff08;PySide6开发&#xff09;优势&#xff1a;界面简洁易用&#xff0c;代码结构清晰&#xff0c;适合初学…...

SeargeSDXL:让SDXL图像生成像搭积木一样简单的ComfyUI终极方案

SeargeSDXL&#xff1a;让SDXL图像生成像搭积木一样简单的ComfyUI终极方案 【免费下载链接】SeargeSDXL Custom nodes and workflows for SDXL in ComfyUI 项目地址: https://gitcode.com/gh_mirrors/se/SeargeSDXL 还在为ComfyUI中复杂的SDXL工作流程而头疼吗&#xff…...

高压柔性输电系统中的6脉冲与12脉冲晶闸管控制HVDC仿真模型说明文档

高压柔性输电系统6脉冲&#xff0c;12脉冲晶闸管控制HVDC的仿真模型&#xff0c;说明文档江湖上流传着这么一句话&#xff1a;"搞HVDC不玩晶闸管&#xff0c;就像吃火锅不放辣"。今天咱们就扒一扒那些藏在MATLAB/Simulink里的6脉冲和12脉冲换流器秘密。先说个冷知识&…...

嵌入式图像处理实战:中值滤波 vs 均值滤波在STM32上的性能对比(附代码)

嵌入式图像处理实战&#xff1a;中值滤波 vs 均值滤波在STM32上的性能对比&#xff08;附代码&#xff09; 在机器人视觉或工业检测系统中&#xff0c;一个突如其来的像素噪点可能导致整个识别算法崩溃。我曾亲眼见证过某产线机械臂因图像传感器受到电磁干扰&#xff0c;将正常…...

保姆级教程:用CST 2023的RLC求解器搞定空心电感仿真(附网格优化技巧)

从零到精通的CST空心电感仿真实战指南&#xff1a;RLC求解器与网格优化全解析 在电磁兼容设计和高频电路开发中&#xff0c;空心电感作为无磁芯干扰的理想元件&#xff0c;其精确建模一直是工程师的痛点。传统手工计算难以应对复杂的高频效应&#xff0c;而商业仿真软件的门槛…...

提升开发效率:Android Studio零障碍IDE本地化配置指南

提升开发效率&#xff1a;Android Studio零障碍IDE本地化配置指南 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 开发人员在使用…...

LFM2.5-1.2B-Thinking-GGUF部署教程:适配A10/A100/L4等主流GPU显存优化方案

LFM2.5-1.2B-Thinking-GGUF部署教程&#xff1a;适配A10/A100/L4等主流GPU显存优化方案 1. 模型简介与核心优势 LFM2.5-1.2B-Thinking-GGUF 是 Liquid AI 推出的轻量级文本生成模型&#xff0c;专为低资源环境优化设计。该模型采用 GGUF 格式存储&#xff0c;配合高效的 llam…...