这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
这篇笔记记录在抖音后端开发过程中关于Gorm读写数据库的相关知识点
引言
在后端开发过程中,基本所有数据都得写入数据库进行永久保存,在开发过程中学习到了Gorm技术,能够方便的对数据库进行增删改查的操作,下面将对其中的知识点进行记录分析。
GORM
ORM 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
GORM 是使用Golang语言编写的ORM库,能够让开发人员方便的对数据库进行操作。
用法分析
下面将从实际项目开发时的使用进行相关分析
官方给出了简洁的使用方法,但是对于初学者还是比较迷惑不清楚应该怎么做,因此下面将对其进行详细分析。
type User struct {
Id int64 `gorm:"primary key" json:"id,omitempty"`
Username string `gorm:"not null; unique; size:32; index:idx_username" json:"name,omitempty"`
Password []byte `gorm:"not null; type:varbinary(256)" json:"password"`
Salt []byte `gorm:"not null; type:varbinary(32)" json:"-"`
}
1.首先定义结构体,在结构体字段后使用tag标签进行描述,其中使用
gorm:"primary key" 指定在进行创建数据表和使用数据时,这个字段是主键,能够进行自动映射;
gorm:"not null; type:varbinary(256)" 指定属性为 not null,即在数据库中必须填写数据,且指定数据库中的类型为 256位二进制数据
2.使用Gorm创建数据表
db := DB.Migrator()
tables := []interface{}{&User{}, &Video{}, &Comment{}, &Follow{}, &Favorite{}}
for _, table := range tables {
if !db.HasTable(&table) {
if err := db.CreateTable(&User{}); err != nil {
return err
}
}
}
DB.Migrator 会进行自动映射,然后通过 CreateTable 创建对应的数据表
3.创建数据
func (u *UserDao) AddUser(user *User) error {
var count int64
if err := DB.Table("users").Where("username =? ", user.Username).Count(&count).Error; err != nil {
return err
}
if count != 0 {
return ErrUserExists
}
return DB.Create(user).Error
}
这里首先判断是否存在同名用户,如果已存在则返回对应错误信息
不存在情况再使用 Create函数进行创建,注意 传入的参数 user 是对应的结构体指针,只有这样才能对数据进行正确读取
4.查找数据
func (u *UserDao) QueryUserByName(name string) (*User, error) {
var user User
err := DB.Model(&User{}).Where("username = ? ", name).First(&user).Error
if err == gorm.ErrRecordNotFound {
return nil, ErrUserNotExists
}
return &user, err
}
向Model方法传入空结构体指针进行对应数据字段,然后使用 Where方法进行条件查询指定的用户名,并使用 Find方法将其写入到对应结构体当中
5.删除数据
func (f *FollowActionDao) DeleteFollow(from, to int64) error {
return DB.Where("follower_id = ? AND followee_id = ? AND deleted_at IS NULL", from, to).Delete(&Follow{}).Error
}
首先使用 Where方法进行条件查询,其中需要指定 deleted_at IS NULL 这个是当数据库删除数据时并不会直接删除,而是将这个字段设置为删除时间,因为数据可能在后续是有用处;虽然 Delete 方法会自动判断,但为了写代码统一,就都加上这一个条件判断
6.修改数据
DB.Model(&user).Where("active = ?", true).Update("name", "hello")
通过 Where方法查询条件,再使用 update方法修改对应属性数据
小结
通过使用Gorm,能够极大方便再读写过程中的操作,减轻开发人员的工作量,使得我们能够将工作重点放在其他重要逻辑上面