这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
Gorm
声明模型
首先定义一个实体。
在Gorm中遵循约定大于规范。
此处的约定:
- ID 一般为主键名。
- CreateAt,UpdateAt,DeletedAt 分别是创建该行数据的时间,更新该函数据的时间,删除该行数据的时间。
- DeletedAt在刚创建数据的时候为null。软删除该数据的时候会加上删除该数据的时间。表示该数据以及删除。
- 如果没有对该实体设置对应的表的名字,则该实体对应的表的名字为该结构体的
蛇形复数也就是User->users
package entity
import (
"gorm.io/gorm"
)
type User struct {
ID uint
Name string
Age uint8
//gorm.Model 中的字段名对应到数据库分别是: `created_at`,`updated_at`,`deleted_at`,`id`
// deleted_at 在刚创建的时候是null,但是被软删除的时候会填入删除的时候的时间
gorm.Model
}
func (User) TableName() string {
// 设置在gorm中该表的对应的表名
return "users"
}
CRUD接口
首先先与数据库建立连接
// "用户名:密码@tcp(地址:端口)/数据库名"
var dsn = "root:root@tcp(127.0.0.1:3306)/studygorm?charset=utf8mb4&parseTime=True&loc=Local"
// 基于dialector打开初始化db会话
var db, _ = gorm.Open(mysql.Open(dsn), &gorm.Config{})
增加
传入一个User实体,gorm会根据该实体的字段将其添加到数据库
db.Create也可以传入一个切片进行批量插入。
func CreateUser(user entity.User) entity.User { //传入user
//创建user
db.Create(&user)
return user
}
删除
删除。
传入一个结构体变量,gorm根据该结构体的主键ID对数据库对应的主键进行删除。
也可以传入一个结构体的指针,并指定主键的ID进行删除。
其中,可以通过tx.RowsAffected来判断删除的条数。从而判断是否删除成功。
func DeleteUser(user entity.User) bool {
//根据结构体,以及指定的主键删除user
//db.Delete(&entity.User{}, 1)
//根据结构体,以及指定的主键数组删除user
//db.Delete(&entity.User{}, []int{1,2,3})
//根据实体对应的主键 删除user 。并附加错误处理
tx := db.Delete(&user)
//如果删除之后的rowsAffected==0则说明没有成功删除
if tx.RowsAffected == 0 {
return false
}
return true
}
查找
最简单的查找方法是使用db.First(),它将会查找出符合条件的第一条记录
func GetUser(i uint) entity.User {
user := entity.User{ID: i}
db.First(&user)
return user
}
也可以使用链式查询进行查询。
更新
更新。
注意:如果一行数据被软删除了,那么再次更新或者插入该数据对应的主键都会失败!
func UpdateUser(user entity.User) bool {
//保存所有字段,即使该字段是零值
tx := db.Save(&user)
if tx.RowsAffected == 0 {
return false
}
return true
}