前言
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 提供了 First
、Take
、Last
方法,以便从数据库中检索单个对象。当查询数据库时它添加了 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
方法支持 struct
和 map[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)
- Post link: https://www.godhearing.cn/gorm/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.