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

96 阅读3分钟

导语:我是一个刚接触go语言的小白,在完成了一部分抖音后端项目的开发任务之后,对GORM有了一定的认识后,特在此对所学内容进行记录,如内容有误,还请大家多多海涵!

一、GORM简述

1.1 什么是ORM?

Object指对象,即程序中的对象/实例,例如go中的结构体实例

Relational指关系,关系数据库,例如MySQL

Mapping指映射

在GORM中,对于以下的用户信息表

image.png

对应关系:

数据包----结构体

数据行---结构体实例

字段---结构体字段

1.2 GORM特性

  • 全功能 ORM
  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 PreloadJoins 的预加载
  • 事务,嵌套事务,Save Point,Rollback To Saved Point
  • Context、预编译模式、DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
  • SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
  • 复合主键,索引,约束
  • Auto Migration
  • 自定义 Logger
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…
  • 每个特性都经过了测试的重重考验
  • 开发者友好

1.3 GORM安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

二、GORM链连接数据库

连接不同的数据库都需要导入不同的数据库驱动,在本次青训营中,我使用的是MySQL数据库

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

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{})
}

dsn中为MySQL数据库的用户名、密码、主机、数据库名称等信息,然后调用gorm.Open()打开数据库,并进行gorm信息配置。

在数据库使用结束后,还应该记得关闭db.Close()

三、GORM模型定义

为了方便模型定义,GORM内置了一个gorm.Model结构体。gorm.Model是一个包含了ID, CreatedAt, UpdatedAt, DeletedAt四个字段的Golang结构体。

// gorm.Model 定义
type Model struct {
  ID        uint `gorm:"primary_key"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt *time.Time
}

可以将其嵌入到自己定义的模型中:

typedef User struct {
    gorm.Model
    Name string         `json:"name" gorm:"column:name;comment:用户名;uniqueIndex:user_name;type:varchar(64);NOT NULL;"`
    Nickname string     `json:"nick_name" gorm:"column:nick_name;comment:昵称;type:varchar(64);NOT NULL;"`    
    Password string     `json:"-" gorm:"column:password;comment:密码;type:varchar(64);"`
}

也可以不使用gorm.Model,自行定义模型

注意事项:

结构体里面的变量 (例如Name) 必须是首字符大写
gorm 指定类型
json 表示json接受的时候的名称
binding required 表示必须传入
GORM 默认会使用名为ID的字段作为表的主键
表名默认就是结构体名称的复数,设置db.SingularTable(true)后,表名不为复数,也可以通过Table()指定表名

最后,使用自动迁移db.AutoMigrate(&User{})将结构体和数据库中的数据表进行对应

四、简单的CRUD操作

4.1 增加数据--Create


  db.Create(&User{Code: "D42", Price: 100})

4.2 查询数据--Read

var user User
db.First(&user)  //查询表中第一条数据保存到user

4.3 更新数据--Update

db.Model(&user).Update("Nickname","青训营")

4.4 删除数据--Delete

db.Delete(user)

五、我的心得

很多人将GORM称之为Go的Mybaits,所以GORM对于Go来说应该是很重要的,学习GORM对Go的后端开发来说也是必不可少的,GORM有中文文档可以学习,中文文档非常详细,可以让我们学习起来更加容易,b站上也有很多大佬的视频,在学习GORM的过程中,我收获很多。在增删改查操作部分我没有写的很详细是因为我发现已经有大佬写的很详细了,我就不班门弄斧了。

GORM中文文档

GORM详细的CRUD操作