本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1、 Gin GORM CURD
1、用指定的字段增加数据
//写一个User结构体实例赋值给user
user := User{
Name: "小明",
Age: 12,
Birthday: time.Now()
}
//我们可以指定某一个字段插入数据
db.Select("Name", "Age", "CreatedAt").Create(&user)
//相当于使用INSERT语句指定字段插入数据
//Omit忽略某些字段不插入,其他得字段插入数据,也就是说Name、Age、Create三个字段不插入数据,其余得均从user中获取并插入数据
db.Omit("Name", "Age", "CreatedAt").Create(&user)
2、批量插入
1、法一
//将一个 切片 传递给 `Create` 方法
var users = []User{{Name: "小明"}, {Name: "小红"}, {Name: "小芳"}}
//GORM 将生成单独一条SQL语句来插入所有数据
db.Create(&users)
//回填主键的值,钩子方法也会被调用。
for _, user := range users {
user.ID // 1,2,3
}
2、法二:
使用 CreateInBatches 分批创建
var users = []User{{name: "小明_1"}, ...., {Name: "小明_999"}}
// 指定每批得数量为99
db.CreateInBatches(users, 99)
注意:使用CreateBatchSize 选项初始化 GORM 时,所有的创建& 关联 INSERT 都将遵循以下选项
//打开数据库,CreateBatchSize配置
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{
CreateBatchSize: 1000,
})
//session
db := db.Session(&gorm.Session{CreateBatchSize: 1000})
//切片方法
users = [5000]User{{Name: "小明", Pets: []Pet{pet1, pet2, pet3}}...}
db.Create(&users)
3、创建钩子(hook)
Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数。
有 BeforeSave, BeforeCreate, AfterSave, AfterCreate这四个hook方法
如果你为hook模型定义了指定的方法,它会在增删改查时自动被调用。任何一个回调返回错误,GORM 将停止后续的操作并回滚事务。
//使用BeforeCreate方法
func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
//当前唯一序列号
u.UUID = uuid.New()
//角色
if u.Role == "admin" {
//返回错误
return errors.New("invalid role")
}
return
}
跳过hook的方法
DB.Session(&gorm.Session{SkipHooks: true}).Create(&user)
4、Map创建
GORM 支持根据 map[string]interface{} 和 []map[string]interface{}{} 创建记录
使用map键值对的方法
db.Model(&User{}).Create(map[string]interface{}{
"Name": "小明",
"Age": 12,
})
// 批量插入
db.Model(&User{}).Create([]map[string]interface{}{
{"Name": "小明_1", "Age": 12},
{"Name": "小明_2", "Age": 23},
})
5、使用 SQL 表达式、Context Valuer 创建记录
GORM 允许使用 SQL 表达式插入数据
法一:
根据 map[string]interface{}创建
// 通过 map 创建记录
db.Model(User{}).Create(map[string]interface{}{
"Name": "小明",
"Location": clause.Expr{SQL: "ST_PointFromText(?)", Vars: []interface{}{"POINT(222 333)"}},
})
法二:自定义数据类型创建
// 通过自定义类型创建记录
type Location struct {
X, Y int
}
// Scan 方法实现了 sql.Scanner 接口
func (loc *Location) Scan(v interface{}) error {
}
func (loc Location) GormDataType() string {
return "geometry"
}
func (loc Location) GormValue(ctx context.Context, db *gorm.DB) clause.Expr {
return clause.Expr{
SQL: "ST_PointFromText(?)",
Vars: []interface{}{fmt.Sprintf("POINT(%d %d)", loc.X, loc.Y)},
}
}
type User struct {
Name string
Location Location
}
db.Create(&User{
Name: "jinzhu",
Location: Location{X: 100, Y: 100},
})
更多高级用法,让你的代码更优雅,移步官方文档:gorm.io/zh_CN/docs/…