当前位置: 首页 > 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.lryc.cn/news/578568.html

相关文章:

  • [论文阅读] 人工智能 + 软件工程 | 从软件工程视角看大语言模型:挑战与未来之路
  • 使用 icinga2 写入 TDengine
  • 基于ApachePOI实现百度POI分类快速导入PostgreSQL数据库实战
  • SpringBoot计时一次请求耗时
  • 基于netmiko模块实现支持SSH or Telnet的多线程多厂商网络设备自动化巡检脚本
  • 浏览器F12开发者工具的使用
  • [Python] -基础篇7-新手常见Python语法错误及解决方案
  • Qt时间显示按钮功能详解
  • openlayers根据图层名称判断图层是否在视口内
  • js代码09
  • Maven安装使用教程
  • java web2(黑马)
  • 阿里云-云效自动部署spring boot项目
  • vue + element-ui实现可拖拽表格
  • Windows VMWare Centos Docker部署Springboot + mybatis + MySql应用
  • 学习昇腾开发的第12天--安装第三方依赖
  • 飞算 JavaAI:我的编程强力助推引擎
  • 前端常用构建工具介绍及对比
  • ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模
  • HTML 安装使用教程
  • Kafka日常运维命令总结
  • 数据的表示
  • 基于 Vue + RuoYi 架构设计的商城Web/小程序实训课程
  • 苹果AR/VR头显路线图曝光,微美全息推进AI/AR智能眼镜新品开启视觉体验篇章
  • 61、【OS】【Nuttx】【构建】向量表
  • 每日一练:找到初始输入字符串 I
  • 新版本 Spring Data Jpa + QueryDSL 使用教程
  • Zephyr RTOS 信号量 (Semaphore)
  • GitHub已破4.5w star,从“零样本”到“少样本”TTS,5秒克隆声音,冲击传统录音棚!
  • MySQL 8.4 备份与恢复完全指南