本文已参与「新人创作礼」活动,一起开启掘金创作之路。
接上文:https://juejin.cn/post/7100627175878950948
```go //写一个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)
```
//将一个 切片 传递给 `Create` 方法 var users = []User{{Name: "小明"}, {Name: "小红"}, {Name: "小芳"}} //GORM 将生成单独一条SQL语句来插入所有数据 db.Create(&users) //回填主键的值,钩子方法也会被调用。 for _, user := range users { user.ID // 1,2,3 }
使用 CreateInBatches
分批创建 ```go var users = []User{{name: "小明1"}, ...., {Name: "小明999"}}
// 指定每批得数量为99 db.CreateInBatches(users, 99) ```
注意:使用CreateBatchSize
选项初始化 GORM 时,所有的创建& 关联 INSERT
都将遵循以下选项 ```go //打开数据库,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) ```
Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数。 有 BeforeSave
, BeforeCreate
, AfterSave
, AfterCreate
这四个hook方法 如果你为hook模型定义了指定的方法,它会在增删改查时自动被调用。任何一个回调返回错误,GORM 将停止后续的操作并回滚事务。 go //使用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)
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}, }) ```
根据 map[string]interface{}
创建
go // 通过 map 创建记录 db.Model(User{}).Create(map[string]interface{}{ "Name": "小明", "Location": clause.Expr{SQL: "ST_PointFromText(?)", Vars: []interface{}{"POINT(222 333)"}}, })
```go // 通过自定义类型创建记录 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}, }) ``` 更多高级用法,让你的代码更优雅,移步官方文档:https://gorm.io/zh_CN/docs/create.html