前言

GORM,是Go语言中的ORM(对象关系映射),什么是ORM,是通过使用描述对象和数据库之间映射的元数据,将程序中的对象与关系数据库相互映射

坦白来说,就是一个简略sql语句的工具,每个人写sql语句习惯不同,不一定每个人都能看得懂,但是,换成orm后,统一的格式,无论在业务交接上还是便捷度上,都有很大的提升。

推荐去官网阅读文档,中文文档非常简便,我也不想搬过来了,就简简单单的使用一下。

官网

安装

go get -u gorm.io/gorm

直接go get安装即可,GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server,本文章就以mysql为例。

连接数据库

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

func main() {
	// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
	dsn := "账号:密码@tcp(IP:端口号)/数据库名字?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	fmt.Println(db)
	fmt.Println(err)
}

定义模型

就使用结构体即可,不过需要一点,实现一个TableName接口,否则他会在映射时表名多加一个s。比如有个表user,只有id和name两个字段

type User struct {
	ID   uint
	Name string
}

func (User) TableName() string {
	return "user"
}

如果不写这个TableName的话,默认会映射成为users表。

Create

Gorm是我见过最简单的orm了,只需要将数据指针地址传过去,就ok

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

type User struct {
	ID   uint
	Name string
}

func (User) TableName() string {
	return "user"
}

func main() {
	user := User{ID: 0, Name: "Salmon"}

	dsn := "root:root@tcp(127.0.0.1:3306)/test01?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err!= nil{
		panic(err)
	}
	result := db.Create(&user)
	fmt.Println(user.ID)
}
user.ID             // 返回插入数据的主键
result.Error        // 返回 error
result.RowsAffected // 返回插入记录的条数

Read

GORM 提供了 FirstTakeLast 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误。

// 获取第一条记录(主键升序)
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;

// 获取一条记录,没有指定排序字段
db.Take(&user)
// SELECT * FROM users LIMIT 1;

// 获取最后一条记录(主键降序)
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;

result := db.First(&user)
result.RowsAffected // 返回找到的记录数
result.Error        // returns error

// 条件查询
db.Where("id=?", 19).Find(&users)

// 检查 ErrRecordNotFound 错误
errors.Is(result.Error, gorm.ErrRecordNotFound)

主键检索

db.First(&user, 10)
// SELECT * FROM users WHERE id = 10;

db.First(&user, "10")
// SELECT * FROM users WHERE id = 10;

db.Find(&users, []int{1,2,3})
// SELECT * FROM users WHERE id IN (1,2,3);

查询所有,使用Find方法,并且,接收值为数组。

var users []User
	//users := make([]User, 10)
	dsn := "root:root@tcp(127.0.0.1:3306)/test01?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err!= nil{
		panic(err)
	}
	db.Find(&users)
	fmt.Println(users)

Update

更新单个列,当使用 Update 更新单个列时,你需要指定条件,否则会返回 ErrMissingWhereClause 错误,查看 Block Global Updates 获取详情。当使用了 Model 方法,且该对象主键有值,该值会被用于构建条件

db.Model(User{}).Where("id=?", 19).Update("role","Salmon")
fmt.Println(users)
// db.Model(&users).Where("id=?", 19).Update("role","godhearing")

更新多列

Updates 方法支持 structmap[string]interface{} 参数。当使用 struct 更新时,默认情况下,GORM 只会更新非零值的字段

db.Model(&users).Where("id=?", 19).Updates(User{ID: 20,Role: "godhearing"})

只更新某些字段(Select),忽略某些字段(Omit)

db.Model(&users).Where("id=?", 20).Select("role").Updates(User{ID: 21,Role: "龙"})

db.Model(&users).Where("id=?", 20).Omit("role").Updates(User{ID: 21,Role: "龙"})

Delete

根据主键删除

db.Delete(&User{}, 22)

条件删除

db.Where("role = ?", "asdasd").Delete(&users)