Gin使用GORM进行CURD2

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

接上文:https://juejin.cn/post/7100627175878950948

1、 Gin GORM CURD

1、用指定的字段增加数据

```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)

```

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 分批创建 ```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) ```

3、创建钩子(hook)

Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数。 有 BeforeSaveBeforeCreateAfterSaveAfterCreate这四个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)

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{}创建

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

你可能感兴趣的:(数据库,java,sql,database,开发语言)