使用 GORM连接数据库并实现CRUD | 青训营

158 阅读4分钟

一般通用示例代码:

package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

type Product struct {
	gorm.Model
	Code  string
	Price uint
}

func main() {

	// 连接数据库
	dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

	if err != nil {
		panic("failed to connect database")
	}

	// 创建表
	db.AutoMigrate(&Product{})

	// 增
	db.Create(&Product{Code: "D42", Price: 100})

	// 改
	var product Product
	db.First(&product, 1) // 查找ID=1的product
	product.Price = 200
	db.Save(&product) // 保存修改

	// 删
	db.Delete(&product, 1) // 删除ID=1的product

	// 查
	var products []Product
	db.Find(&products) // 查找全部
	for _, p := range products {
		println(p.Code)
	}

}

主要步骤:

  1. 使用mysql.Open连接数据库

  2. 使用gorm.Open并传入配置初始化ORM

  3. 使用AutoMigrate自动创建表

  4. 通过Create、Save、Delete等方法实现增删改

  5. 通过First、Find等方法查询数据

更详细的文字说明:

  1. 导入需要的包:
import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

这里导入了gorm.io/driver/mysql,它包含了gorm连接MySQL数据库的驱动。 还导入了gorm.io/gorm,它是GORM库的主包。

  1. 定义模型结构体:
type Product struct {
  gorm.Model
  Code string
  Price uint
}

这里通过嵌入gorm.Model Anonymous Field来包含一些ORM需要的默认字段,然后定义了业务字段Code和Price。 3. 连接数据库:

dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

构建数据库连接DSN,然后通过mysql.Open()打开连接,最后使用gorm.Open()与数据库建立会话。 4. 自动创建表:

db.AutoMigrate(&Product{})

根据模型结构自动创建对应的数据库表。 5. CRUD操作:

  • Create: db.Create(&Product{...})
  • Read: db.First(&product, id)
  • Update: db.Save(&product)
  • Delete: db.Delete(&product, id) 通过调用简单的方法即可执行相应的SQL。 GORM使得Go语言实现ORM非常简单,可以大大减少编写SQL语句的工作量。充分利用GORM提供的各种方法可以快速实现强大的CRUD功能

字节青训营项目中实践应用示例

我负责项目的点赞操作和喜欢列表,我以赞操作的DAO文件和MySQL的配置文件作为实践应用示例:

MySql.go文件

实现了创建GORM连接MYSQL数据库的功能,主要分以下几步:

  1. 导入需要的包,包括数据库驱动mysql,GORM库以及配置和日志包。
  2. 定义了全局变量GORM用于保存GORM的DB对象。
  3. 创建CreateGORMDB方法,这个方法用来创建和初始化GORM的DB对象。
  4. 在方法内部使用gorm.Open打开连接,传入mysql.Open()返回的底层连接信息以及gorm的配置。
  5. 获取底层连接db.DB(),设置最大连接数、最大空闲连接数和连接最大生存时间,控制连接池。
  6. 将db赋值给全局变量GORM,供后续使用。
  7. 创建GetMysqlDB方法,该方法返回全局GORM,供外部获取使用。 这样通过CreateGORMDB初始化全局的GORM DB对象,在需要使用数据库的地方,只需要调用GetMysqlDB获取已经建立好的连接实例即可,避免重复创建连接。 这实现了数据库连接的单例模式,可以重用连接池,提高效率。同时连接参数可配置,兼顾灵活性。 通过封装,外部只需要简单调用GetMysqlDB即可开始使用GORM调用数据库。
//MySql.go
package db  
  
import (  
    "TinyTikTok/config"  
    "gorm.io/driver/mysql"    "gorm.io/gorm"    "log"    "time")  
  
var GORM *gorm.DB  
  
func CreateGORMDB() {  
    db, err := gorm.Open(mysql.Open(config.Config.Mysql), &gorm.Config{})  
    if err != nil {  
       log.Println("gorm Init Error : ", err)  
    }  
    sqlDb, _ := db.DB()  
    sqlDb.SetMaxOpenConns(100)                // 连接池最大打开连接数  
    sqlDb.SetMaxIdleConns(25)                 // 连接池最大空闲连接数  
    sqlDb.SetConnMaxLifetime(1 * time.Minute) // 最大生存时间  
  
    GORM = db // 赋值给全局变量 GORM}  
  
// GetMysqlDB 需要使用数据库的时候直接创建一个连接 调用此方法即可  
func GetMysqlDB() *gorm.DB {  
    return GORM  
}

FavoriteDAO.go

这些代码是实现对Favorite表进行数据库操作的DAO层,主要包含了以下3个函数:

  1. AddFavorite函数用来新增一个点赞记录,它调用db包的GetMysqlDB获取数据库连接,然后使用Create新增传递的参数favorite模型,并返回记录的id和error。
  2. UpdateFavorite函数用来更新一个点赞记录,它使用Model指定更新的模型,Where指定更新条件,然后调用Update执行update查询,最后返回error。
  3. GetFavorite函数用来根据用户id和视频id查询点赞记录,它使用Where构造查询条件,Find查询并填充结果到favorite模型,最后返回favorite对象和error。 可以看出,这些函数实现了对Favorite表的增删改查操作。 主要逻辑是利用db包中的连接,调用gorm的各种方法如Create、Update、Where、Find等操作数据库。 这样可以把数据库操作集中到dao层,外部调用只需要传入模型或条件,非常简洁;而数据库的连接创建、连接池等细节都封装在db包中,DAO层只需要简单调用GetMysqlDB()获取数据库连接实例;这实现了典型的分层设计,提高了代码的复用性和可维护性。
//FavoriteDAO.go
package dao  
  
import (  
    "TinyTikTok/db"  
    "TinyTikTok/models")  
  
// AddFavorite 添加点赞数据  
func AddFavorite(favorite models.Favorite) (int64, error) {  
  
    result := db.GetMysqlDB().Create(&favorite)  
    return favorite.Id, result.Error  
}  
  
// UpdateFavorite 更新点赞数据  
func UpdateFavorite(favorite models.Favorite) error {  
  
    result := db.GetMysqlDB().Model(&models.Favorite{}).  
       Where("id = ?", favorite.Id).  
       Update("is_favorite", favorite.IsFavorite)  
    return result.Error  
}  
  
// GetFavorite 根据userId和videoId获取点赞数据  
func GetFavorite(userId int64, videoId int64) (models.Favorite, error) {  
    var favorite models.Favorite  
    result := db.GetMysqlDB().  
       Where("user_id = ? AND video_id = ? AND is_deleted <> 1", userId, videoId).  
       Find(&favorite)  
    return favorite, result.Error  
}