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

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.xdnf.cn/news/14918.html

相关文章:

  • nginx配置websocket
  • 如何在电脑上完全抹去历史记录
  • Ubuntu 20.04 下 OpenVINO 2024 安装与配置
  • 与后端现场联调mock数据
  • 内网ubuntu系统安装mysql
  • 直播 APP 开发需要多少成本
  • SpringBoot -- 自动配置原理
  • 回写缓存为何需要脏位?
  • 【MySQL基础】MySQL索引全面解析:从原理到实践
  • Linux 系统管理:自动化运维与容器化部署
  • AI编程实战:Cursor黑科技全解析
  • uniapp小程序蓝牙打印通用版(集成二维码打印)
  • 如何在Vue3中正确使用ref和reactive?
  • 2025年数据可视化十大创新趋势
  • 【分布式】自定义统一状态机流转设计
  • 【Pandas】pandas DataFrame Flags
  • Java开发新变革!飞算JavaAI深度剖析与实战指南
  • 【软考中级·软件评测师】下午题·面向对象测试之架构考点全析:分层、分布式、微内核与事件驱动
  • 网络拓扑图绘制全流程:从架构解析到工具实战
  • CAU数据挖掘 支持向量机
  • AI 情感陪伴的乱与治:在困境中探寻未来航道
  • Windows如何安装beego环境问题解
  • Android Telephony 网络状态中的 NAS 信息
  • API接口安全-2:签名、时间戳与Token如何联手抵御攻击
  • 后台管理系统的诞生 - 利用AI 1天完成整个后台管理系统的微服务后端+前端
  • vue-33(实践练习:使用 Nuxt.js 和 SSR 构建一个简单的博客)
  • LabVIEW键盘鼠标监测控制
  • SpringBoot 启动入口深度解析:main方法执行全流程
  • 颠覆传统加密:微算法科技创新LSQb算法,提升量子图像处理速度
  • 【debug日记】解决 Conda 激活命令未正确配置的问题