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¶m2=value2"
示例组成部分说明
部分 | 说明 | 示例值 |
---|---|---|
root | 数据库用户名 | root |
54264534 | 数据库密码 | 54264534 |
tcp | 连接协议(也可以是 unix 或 udp ) | tcp |
192.168.190.132:3306 | MySQL 服务器地址和端口 | 192.168.190.132:3306 |
grom_test | 要连接的数据库名称 | grom_test |
charset=utf8mb4 | 设置字符集(支持完整的 Unicode,包括表情符号) | utf8mb4 |
parseTime=True | 将数据库时间类型(如 DATETIME )解析为 Go 的 time.Time | True |
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 技术论坛