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 是在創建、查詢、更新、刪除等操作之前、之后調用的函數。 有?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)
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
總結
以上是生活随笔為你收集整理的Gin使用GORM进行CURD2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 测度与概率的定义
- 下一篇: 个人云服务器部署leanote(蚂蚁笔记