GORM简单上手指南:轻松搞定数据库增删改查 | 青训营

40 阅读4分钟

本文章为自己在基于课程视频时学习Gorm所得心得体会,本人拙见,若有不足之处,还请各位多多指出。

1. 什么是Gorm

Gorm(全称:Go Object Relational Mapping)是一个针对 Go 语言的对象关系映射(ORM)库。ORM 是一种编程技术,用于在关系型数据库和编程语言对象之间建立映射关系,使开发者能够使用面向对象的方式操作数据库,而不必直接编写 SQL 查询语句。

Gorm 在 Go 语言中提供了一种简化数据库操作的方式,它允许开发者定义结构体来表示数据库表格,然后通过 Gorm 提供的方法进行数据库的增、删、改、查操作,而无需手动编写 SQL 语句。Gorm 支持多种数据库后端,如 MySQL、PostgreSQL、SQLite 等。

Gorm 的主要特点包括:

  1. 模型定义:通过定义 Go 结构体来映射数据库表格,可以指定字段的名称、数据类型、主键、索引等属性。
  2. 查询构建:Gorm 提供了丰富的查询构建方法,可以轻松地构造复杂的查询条件和排序规则,从而减少手写 SQL 查询的工作量。
  3. 事务支持:Gorm 支持事务操作,可以确保数据库操作的原子性和一致性。
  4. 预加载和延迟加载:可以通过预加载相关联的数据来优化查询性能,同时支持延迟加载以避免不必要的数据加载。
  5. 钩子函数:可以在模型的不同生命周期阶段注册回调函数,实现自定义的业务逻辑。
  6. 迁移工具:Gorm 提供了数据库迁移工具,可以自动同步数据库表结构和代码定义的模型。
  7. 插件扩展:可以通过插件扩展 Gorm 的功能,例如添加缓存支持、审计日志等。

2. 如何使用Gorm

Gorm的使用方式十分简单,只需要简单的几步操作即可进入CRUD的世界。

2.1. 下载gorm库

最简单的方式就是直接使用命令下载安装Gorm

go get -u github.com/jinzhu/gorm

当然,在有了go mod后,可以让其自动添加gorm的依赖包,也可以手动自行添加

更多相关操作可以参看go-demo的项目DMinerJackie/go-demo: go to go (github.com)

2.2. 数据库连接

使用grom创建数据库连接

package main
​
import (
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)
​
func main() {
    db, err := gorm.Open("mysql", "root:root@(127.0.0.1:3306)/db1?charset=utf8mb4&parseTime=True&loc=Local")
    
    if err!= nil{
        panic(err)
    }
    defer db.Close()
}

2.3. 定义模型

定义自己的数据模型,以映射到 MySQL 数据库表格和操作数据。以下是一个关注模块的简单例子

type Follow struct {
    UserID     int64     // 关注人ID
    FollowerID int64     // 被关注人ID
    CreateAt   time.Time // 关注发起时间
    Status     int8      // 关注状态(1:关注,默认0)
}

2.4. 创建表

对于表的创建,可以直接通过 db.CreateTable 创建表了,非常方便,还可以通过 db.Set 设置一些额外的表属性

if !db.HasTable(&Follow{}) {
    if err := db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").CreateTable(&Follow{}).Error; err != nil {
        panic(err)
    }
}

2.5. 插入

先构造已给对象,直接调用 db.Create() 就可以插入一条记录了

follow := model.Follow{
    UserID:     userId,
    FollowerID: targetId,
    CreateAt:   date,
}
​
if err := config.DB.Select("UserId", "FollowerId", "CreateAt").Create(&follow).Error; nil != err {
    log.Println(err.Error())
    return false, err
}

2.6. 删除

先用 db.Where() 构造查询条件,再调用 db.Delete() 就可以删除

if err := db.Where(&Follow{Hash: hash}).Delete(Follow{}).Error; err != nil {
    eturn err
}

2.7. 修改

Gorm更新数据是通过Update函数操作的,Update函数需要传入要更新的字段和对应的值。

需要通过Model函数来传入要更新的模型,主要是用来确定表名,也可以使用Table函数来确定表名。

result := db.Model(&Follow{}).Where("UserID = ?", "1").Update("UserID", "2") 
if result.Error != nil { 
    log.Fatal(result.Error) 
} else { 
    log.Printf("Updated records: %d\n", result.RowsAffected) 
}

2.8. 查询

先用 db.Model() 选择一个表,再用 db.Where() 构造查询条件,后面可以使用 db.Count() 计算数量,如果要获取对象,可以使用 db.Find(&Follow) 或者只需要查一条记录 db.First(&Follow)

var count int
err := db.Model(&Follow{}).Where(&Follow{UserId: uid, FollowerId: fid}).Count(&count).Error
if err != nil {
    return false, err
}

3. 总结

至此,gorm的简单增删改查操作就已经介绍完了,gorm作为一款orm库,几乎满足了一个CRUDer的一切想象,实现灵活,花样繁多。

有了gorm,就不需要再在代码中维护sql语句了。这值得我们深入学习,而课上所述的更多底层的高级操作,还有待后续课程的学习掌握,本篇文章仅供抛砖引玉,期待更多的大佬一起来学习交流。