这是我参与「第五届青训营 」伴学笔记创作活动的第 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{})