初探gorm | 青训营笔记

84 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天,记录一下对 gorm 框架的学习。

什么是 gorm

Gorm 是一个已经迭代了10年的功能强大的 ORM 框架,拥有丰富的开源扩展,在字节跳动内部广泛使用。

快速开始
引入依赖

首先要引入 gorm 的依赖,其次要引入数据库相应的 driver 依赖,此处引入的是 MySQL 的 driver。

 go get -u gorm.io/gorm
 go get -u gorm.io/driver/mysql
定义 gorm model

下面的代码定义了一个名为 User 的 struct,该 struct 对应着数据库一张名为 user 的表,表名由 TableName 方法指定(如果没有该方法,默认使用 struct 名的蛇形复数作为表名)。User struct 的字段与数据库表列的映射关系由 struct tag gorm:"column:xxx" 指定(如果没有该 struct tag,默认使用字段名的蛇形作为列名)。

 type User struct {
     Id string `gorm:"column:id"`        // 指定对应的列名为id
     Name string `gorm:"column:name"`    // 指定对应的列名为name
     Age uint `gorm:"column:age"`        // 指定对应的列名为age
 }
 ​
 func (*User) TableName() string {
     return "user"                       // 指定表名为user
 }
连接数据库

Gorm 支持的数据源有 MySQL、SQLServer、PostgreSQL、SQLite,此处以 MySQL 为例。

首先定义 MySQL 的 dsn(Data Source Name),然后调用 gorm.Open 函数连接数据库。

Gorm 自带连接池机制,因此只需要初始化一份 DB 对象即可。

 dsn := "root:root@tcp(localhost:3306)/gorm?charset=utf8&parseTime=True&loc=Local"
 DB, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
CRUD

创建一条数据

 user := &User{Id: "1", Name: "Jack", Age: 20}
 DB.Create(user)

创建多条数据

 users := []*User{
     {Id: "2", Name: "Zhangsan", Age: 12},
     {Id: "3", Name: "Lisi", Age: 18},
     {Id: "4", Name: "Wangwu", Age: 20},
 }
 DB.Create(users)

查询一条数据

 user := &User{}
 // 根据主键
 DB.First(user, "1")
 // 根据where条件
 DB.Where("id = ?", "1").First(user)

查询多条数据

 users := make([]*User, 0)
 // 根据主键
 DB.Find(users, []string{"1", "2", "3"})
 // 根据where条件
 DB.Where("age = ?", 18).Find(users)

更新数据

 // 更新单个字段
 DB.Model(&User{}).Where("id", "1").Update("name", "Tom")
 // 更新多个字段,struct形式,不会更新零值
 DB.Model(&User{Id: "1"}).Updates(&User{Name: "Tom", Age: 10})
 // 更新多个字段,map形式,会更新零值
 DB.Model(&User{Id: "1"}).Updates(map[string]any{"name": "Tom", "age": 10})

删除数据

 // 根据主键
 DB.Delete(&User{}, "1")
 // 根据where条件
 DB.Where("name = ?", "Jack").Delete(&User{})
参考

gorm.io/docs/