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

grom使用mysql快速上手

前言

在本文中,我们将介绍如何在 golang 中使用 gorm 这个流行的 ORM 框架来连接 MySQL 数据库,并进行一些基本的增删改查操作。gorm 是一个提供了简洁和强大的功能的 ORM 库,它支持多种数据库,包括 MySQL,PostgreSQL,SQLite,Oracle 等。使用 gorm,我们可以方便地将数据库中的表映射为 golang 中的结构体,以及使用 gorm 提供的方法来执行 SQL 语句。

安装包

要使用 gorm 来连接 MySQL 数据库,我们需要安装 gorm 本身,以及一个适用于 MySQL 的驱动。在本文中,我们使用的是 mysql,这是一个基于官方的 go-sql-driver/mysql 库的 golang 驱动。要安装 gorm 和 mysql,我们可以在终端中执行以下命令:

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

 模型及数据定义

首先,我们需要定义一个模型来映射数据库表。假设我们的项目有一个 Video 模型,可以像这样定义:

package modelsimport "gorm.io/gorm"type Video struct {gorm.ModelTitle       stringDescription stringURL         string
}

 

连接数据库

普通连接

func Conn() *gorm.DB {// 创建一个 gorm.DB 类型的变量var db *gorm.DB// 调用 Open 方法,传入驱动名和连接字符串dsn := "root:54264534@tcp(192.168.190.132:3306)/grom_test?charset=utf8mb4&parseTime=True&loc=Local"// 连接数据库db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {fmt.Println("连接数据库失败:", err)return nil}fmt.Println("连接数据库成功")// 自动迁移(创建表)err = db.AutoMigrate(&models.Video{})if err != nil {fmt.Println("自动迁移失败:", err)return nil}fmt.Println("自动迁移成功")return db
}

dsn是一个连接字符串,用于指定如何连接到 MySQL 数据库

完整dsn格式为

"username:password@protocol(address)/dbname?param1=value1&param2=value2"

示例组成部分说明 

部分说明示例值
root数据库用户名root
54264534数据库密码54264534
tcp连接协议(也可以是 unix 或 udptcp
192.168.190.132:3306MySQL 服务器地址和端口192.168.190.132:3306
grom_test要连接的数据库名称grom_test
charset=utf8mb4设置字符集(支持完整的 Unicode,包括表情符号)utf8mb4
parseTime=True将数据库时间类型(如 DATETIME)解析为 Go 的 time.TimeTrue
loc=Local设置时区(Local 表示使用系统时区)Local

除此以外,db.AutoMigrate 可自动创建数据库表(表不存在自动创建,存在则不创建)

使用连接池

func Conn() *gorm.DB {dsn := "root:54264534@tcp(192.168.190.132:3306)/grom_test?charset=utf8mb4&parseTime=True&loc=Local"// 1. 连接数据库db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {fmt.Println("连接数据库失败:", err)return nil}fmt.Println("连接数据库成功")// 2. 获取底层 SQL 数据库对象并配置连接池sqlDB, err := db.DB()if err != nil {fmt.Println("获取底层数据库连接失败:", err)return nil}// 连接池配置sqlDB.SetMaxIdleConns(10)           // 空闲连接池的最大连接数sqlDB.SetMaxOpenConns(100)          // 数据库的最大打开连接数sqlDB.SetConnMaxLifetime(time.Hour) // 连接可复用的最大时间// 3. 自动迁移(创建表)err = db.AutoMigrate(&models.Video{})if err != nil {fmt.Println("自动迁移失败:", err)return nil}fmt.Println("自动迁移成功")return db
}

断开连接


func Close(db *gorm.DB) {defer func() {sqlDB, err := db.DB()if err != nil {fmt.Println("获取底层数据库连接失败:", err)return}sqlDB.Close() // 关闭数据库连接fmt.Println("数据库连接已关闭")}()
}

表操作


// 插入数据,向数据库插入一条 Video 记录
func CreateVideo(db *gorm.DB, video *models.Video) error {result := db.Create(video)return result.Error
}// 查询数据,根据 id 查询 Video 记录
func GetVideoByID(db *gorm.DB, id uint) (*models.Video, error) {var video models.Videoresult := db.First(&video, id)return &video, result.Error
}// 更新数据,更新 Video 记录(基于 video.ID 更新)
func UpdateVideo(db *gorm.DB, video *models.Video) error {result := db.Save(video)return result.Error
}// 删除数据,删除 Video 记录(基于 video.ID 删除)
func DeleteVideo(db *gorm.DB, video *models.Video) error {result := db.Delete(video)return result.Error
}

使用

package mainimport ("fmt""github.com/jl-sky/grom/golangNotes/datatbase/models""github.com/jl-sky/grom/golangNotes/datatbase/mysql"
)func main() {db := mysql.Conn()defer func() {mysql.Close(db)}()if db == nil {return}//  插入数据newVideo := &models.Video{Title:       "GORM 教程",Description: "学习如何使用 GORM 操作 MySQL",URL:         "https://example.com/gorm-tutorial",}err := mysql.CreateVideo(db, newVideo)if err != nil {fmt.Println("插入失败:", err)} else {fmt.Println("插入成功, ID:", newVideo.ID)}// 查询数据video, err := mysql.GetVideoByID(db, 1) // 假设 ID=1 的记录存在if err != nil {fmt.Println("查询失败:", err)} else {fmt.Printf("查询结果: %+v\n", video)}// 更新数据video.Title = "GORM 高级教程"err = mysql.UpdateVideo(db, video)if err != nil {fmt.Println("更新失败:", err)} else {fmt.Println("更新成功")}// 删除数据err = mysql.DeleteVideo(db, video)if err != nil {fmt.Println("删除失败:", err)} else {fmt.Println("删除成功")}
}

完整代码可参考

golangNotes/datatbase at main · JL-sky/golangNotes

参考资料

GORM 指南 | 入门指南 |《GORM 中文文档 v2》| Go 技术论坛

http://www.lqws.cn/news/599059.html

相关文章:

  • SeaTunnel 社区 2 项目中选“开源之夏 2025”,探索高阶数据集成能力!
  • PHP爬虫实战指南:获取淘宝商品详情
  • 【仿muduo库实现并发服务器】eventloop模块
  • 『深度编码』C++中的参数传递
  • 02.SpringBoot常用Utils工具类详解
  • 【学习方法】框架质疑学习法:破解专业学习的“知识厚度”困境
  • 华为云开始了“开发者空间 AI Agent 开发”活动
  • es的读和写-Reading and writing documents
  • Windows 疑难杂症集 - MsMpEng.exe 磁盘占用率持续高占
  • 发布/订阅模式:解耦系统的强大设计模式
  • 第七讲~~测试工具(禅道项目管理系统)
  • 软件测试期末复习之白盒测试
  • FPGA FMC 接口
  • Electron 进程间通信(IPC)深度优化指南
  • SpringBoot计时一次请求耗时
  • 数据库编程-ORM
  • 基于Pandas和FineBI的昆明职位数据分析与可视化实现(四)- 职位数据可视化(FineBI)
  • Java-String类静态成员方法深度解析
  • HDMI 2.1 FRL协议的流控机制:切片传输(Slicing)和GAP插入
  • 开关电源和线性电源Multisim电路仿真实验汇总——硬件工程师笔记
  • 【SQL知识】PDO 和 MySQLi 的区别
  • Golang的并发编程实践总结
  • github代码中遇到的问题-解决方案
  • RNN和LSTM
  • flv.js视频/直播流测试demo
  • npm link的使用方法详细介绍
  • 动手实践:如何提取Python代码中的字符串变量的值
  • QML通过XMLHttpRequest实现HTTP通信
  • RocketMQ的广播消息和集群消息有什么区别?
  • 密码学(斯坦福)