GORM 框架的使用实践 | 青训营笔记

90 阅读2分钟

GORM 框架的使用实践

GORM 是一款 Go 语言的 ORM 库,它提供了强大的功能和简洁的 API,让数据库操作变得更加简单和易维护。在本文中,将展示如何使用 GORM(Go 的 ORM 库)连接数据库,并实现增删改查操作

  1. 安装 GORM。在命令行中输入以下命令:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
  1. 可以定义一个模型结构体,用于表示我们要操作的数据表, 下面以 Follow 的实体结构体为例
type Follow struct {
	utils.CommonEntity
	UserId       int64 `json:"UserId"`
	FollowUserId int64 `json:"FollowUserId"`
}

type CommonEntity struct {
	Id         int64     `json:"id,omitempty"`
	CreateDate time.Time `json:"create_date,omitempty"`
	IsDeleted  int64     `json:"is_deleted"`
}
  1. 接下来,我们需要连接到 mysql 数据库

    我以一个 Gin 项目为例子,在 utils 包下编写好连接数据库的代码

    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
    }
    
    // GetMysqlDB 需要使用数据库的时候直接创建一个连接 调用此方法即可/**
    func GetMysqlDB() *gorm.DB {
    	return GORM
    }
    

    这段代码读取的是我在 config 包下的配置

    type Configuration struct {
    	MySQL              string                `yaml:"MySQL"`
    	......
    }
    
MySQL: root@tcp(127.0.0.1:3306)/douyin?charset=utf8mb4&parseTime=True

如果 mysql 数据库设置了 密码则要写为 root:password@tcp(127.0.0.1:3306)/douyin?charset=utf8mb4&parseTime=True 的格式

  1. 下面将开始增删改查操作

    // 表名
    func (table *Follow) TableName() string {
    	return "follow"
    }
    
    // Update 更新
    func (f *Follow) Update(tx *gorm.DB) (err error) {
    	err = tx.Where("id = ?", f.Id).Updates(f).Error
    	return
    }
    
    // Insert 插入记录
    func (f *Follow) Insert(tx *gorm.DB) (err error) {
    	f.CommonEntity = utils.NewCommonEntity()
    	err = tx.Create(f).Error
    	return
    }
    
    // Delete 删除
    func (f *Follow) Delete(tx *gorm.DB) (err error) {
    	err = tx.Where("id = ?", f.Id).Delete(f).Error
    	return
    }
    

    下面是查询操作, 添加 Debug () 可以在控制台输出 SQL 语句 。而且在 GORM 中,当使用 Where 方法时,会自动将传入的参数通过预编译语句的方式传递给底层的 SQL 引擎,从而避免了 SQL 注入的风险

    func getFollowByUserIdAndToUserId(userId int64, toUserId int64) (*models.Follow, error) {
    	var res models.Follow
    	err := utils.GetMysqlDB().Model(models.Follow{}).Where("user_id = ? AND follow_user_id = ? AND is_deleted = ?", userId, toUserId, 0).Debug().Find(&res).Error
    	return &res, err
    }
    

屏幕截图 2023-08-20 111151.png 5. 下面将展示使用 GORM 进行事务操作,

使用 Begin () 开启一个事务

 tx := utils.GetMysqlDB().Begin()

若其中一个操作出现错误,可以使用 Rollback() 回滚, 最后使用 Commit () 进行提交

				if err != nil {
					tx.Rollback()
				}
				err1 := follow.Delete(tx)
				if err1 != nil {
					log.Printf(err1.Error())
					tx.Rollback()
				}
				tx.Commit()

GORM 是一个用于 Go 语言的全功能 ORM 库,它简化了数据库操作,提供了简洁易用的 API 来处理复杂的数据模型和数据库交互。GORM 具有强大的功能,包括预编译查询、关联关系管理、事务支持等,使得开发者能够更加便捷地进行高效的数据库操作,同时避免了常见的 SQL 注入攻击。