最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go GORM版本2.0新特性介紹

 更新時間:2022年06月10日 09:57:48   作者:王中陽Go  
這篇文章主要為大家介紹了Go GORM版本2.0新特性的使用示例介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

公元2021年3月30日,坊間流傳PHP的git服務器被黑客攻入,因惡意代碼服務器將關停,PHP還是世界上最好的語言嗎?不知道,我是轉Go了。

本來是想寫gorm相關的知識點的,遇到了批量插入的問題,發(fā)現(xiàn)很不科學,才發(fā)現(xiàn)gorm已經(jīng)出了新版本2.0版本,最新的Tag是v1.21.6,我目前使用的是v1.9.10。

新版本的特性

GORM 2.0 完全從零開始,引入了一些不兼容的 API 變更和許多改進。

Context 支持

通過 WithContext 方法提供 context.Context 支持

db.WithContext(ctx).Find(&users)

批量插入

老版本的批量插入很是惡心,新版本還是非常友好的

我們可以直接將切片slice傳遞給Create方法

var users = []User{{Name: "user1"}, {Name: "user2"}, {Name: "user3"}}
db.Create(&users)
for _, user := range users {
  user.ID // 1,2,3
}

還可以方便的創(chuàng)建測試數(shù)據(jù),使用 CreateInBatches 創(chuàng)建

var users = []User{name: "user_1"}, ...., {Name: "user_10000"}}
// 數(shù)量為 100
db.CreateInBatches(users, 100)

預編譯模式

預編譯Sql執(zhí)行語句,以加速后續(xù)的執(zhí)行效率

// 全局模式,所有的操作都會創(chuàng)建并緩存預編譯語句,以加速后續(xù)執(zhí)行速度
db, err := gorm.Open(sqlite.Open("gorm.db"), &gorm.Config{PrepareStmt: true})
// 會話模式,當前會話中的操作會創(chuàng)建并緩存預編譯語句
tx := db.Session(&Session{PrepareStmt: true})
tx.First(&user, 1)
tx.Find(&users)
tx.Model(&user).Update("Age", 18)

Joins 預加載

1.0版本預加載只能使用Preload,預加載部分升級還是比較大的

使用 Inner Join 預加載關聯(lián),處理null數(shù)據(jù),避免scan失敗

db.Joins("Company").Joins("Manager").Joins("Account").Find(&users, "users.id IN ?", []int{1,2})

Find to Map

這里讓我想到了Laravel的ORM(Eloquent),它做了一層封裝,支持直接返回集合,而不是PHP常用的數(shù)組

這里的 Find to Map 支持直接把結果賦值到map集合中,更方便,更靈活

var result map[string]interface{}
db.Model(&User{}).First(&result, "id = ?", 1)

Create From Map

根據(jù) map[string]interface{} 或 []map[string]interface{} Create

//map[string]interface{} 示例
db.Model(&User{}).Create(map[string]interface{}{"Name": "user", "Age": 18})
//[]map[string]interface{} Create 示例
datas := []map[string]interface{}{
  {"Name": "user_1", "Age": 19},
  {"name": "user_2", "Age": 20},
}
db.Model(&User{}).Create(datas)

事務嵌套

db.Transaction(func(tx *gorm.DB) error {
  tx.Create(&user1)
  tx.Transaction(func(tx2 *gorm.DB) error {
    tx.Create(&user2)
    return errors.New("rollback user2") // rollback user2
  })
  tx.Transaction(func(tx2 *gorm.DB) error {
    tx.Create(&user3)
    return nil
  })
  return nil // commit user1 and user3
})

遠遠不止上面這些,更多關于Go GORM版本2.0特性的資料請關注腳本之家其它相關文章!

相關文章

  • Goland使用delve進行遠程調試的詳細教程

    Goland使用delve進行遠程調試的詳細教程

    網(wǎng)上給出的使用delve進行遠程調試,都需要先在本地交叉編譯或者在遠程主機上編譯出可運行的程序,然后再用delve在遠程啟動程序,本教程會將上面的步驟簡化為只需要兩步,1,在遠程運行程序2,在本地啟動調試,需要的朋友可以參考下
    2024-08-08
  • Go語言測試庫testify使用學習

    Go語言測試庫testify使用學習

    這篇文章主要為大家介紹了Go語言測試庫testify的使用學習示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Go語言中實現(xiàn)完美錯誤處理實踐分享

    Go語言中實現(xiàn)完美錯誤處理實踐分享

    Go?語言是一門非常流行的編程語言,由于其高效的并發(fā)編程和出色的網(wǎng)絡編程能力,越來越受到廣大開發(fā)者的青睞。本文我們就來深入探討一下Go?語言中的錯誤處理機制吧
    2023-04-04
  • Go 語言中的select語句詳解及工作原理

    Go 語言中的select語句詳解及工作原理

    在Go語言中,select語句是用于處理多個通道(channel)操作的一種控制結構,它類似于 switch 語句,本文給大家介紹Go 語言中的select語句詳解及工作原理,感興趣的朋友一起看看吧
    2025-04-04
  • 一文教你Golang如何正確關閉通道

    一文教你Golang如何正確關閉通道

    Go在通道這一塊,沒有內置函數(shù)判斷通道是否已經(jīng)關閉,也沒有可以直接獲取當前通道數(shù)量的方法,因此如果對通道進行了錯誤的使用,將會直接引發(fā)系統(tǒng)?panic,這是一件很危險的事情,下面我們就來學習一下如何正確關閉通道吧
    2023-10-10
  • golang替換無法顯示的特殊字符(\u0000,?\000,?^@)

    golang替換無法顯示的特殊字符(\u0000,?\000,?^@)

    這篇文章主要介紹了golang替換無法顯示的特殊字符,包括的字符有\(zhòng)u0000,?\000,?^@等,下文詳細資料,需要的小伙伴可以參考一下
    2022-04-04
  • go-zero自定義中間件的幾種方式

    go-zero自定義中間件的幾種方式

    首先 go-zero 已經(jīng)為我們提供了很多的中間件的實現(xiàn),但有時難免有需求需要自定義,這里介紹幾種自定義的方法,文中通過代碼示例講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2024-07-07
  • 一文詳解Golang中new和make的區(qū)別

    一文詳解Golang中new和make的區(qū)別

    在Go語言中,new和make是兩個用于創(chuàng)建對象的內建函數(shù)。本文將詳細介紹new和make的區(qū)別,并通過多個方面的分析和代碼示例,幫助大家理解它們的使用場景
    2023-05-05
  • Go時間操作常用方法(推薦!)

    Go時間操作常用方法(推薦!)

    平時開發(fā)過程中,時間相關的操作用的還是很多的,下面這篇文章主要給大家介紹了關于Go時間操作常用方法的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • Go利用GJSON組件解鎖JSON讀取新姿勢

    Go利用GJSON組件解鎖JSON讀取新姿勢

    Go 標準庫提供了 encoding/json 包用于處理 json 數(shù)據(jù),同時第三方庫 GJSON & SJSON 也在 json 處理方面表現(xiàn)出色,下面我們就來看看如何使用GJSON解鎖JSON讀取新方法吧
    2025-03-03

最新評論

万全县| 宾阳县| 曲水县| 沙田区| 荣昌县| 鹤峰县| 古蔺县| 陆川县| 子洲县| 沂水县| 高平市| 阜城县| 玉溪市| 兰考县| 礼泉县| 台南县| 盐城市| 牙克石市| 承德县| 浪卡子县| 江城| 富宁县| 五常市| 绵阳市| 门头沟区| 合肥市| 云安县| 阿拉善左旗| 澄迈县| 贞丰县| 嘉义县| 丹凤县| 永善县| 双桥区| 新乡市| 桦川县| 泰兴市| 西乌珠穆沁旗| 当涂县| 浙江省| 南木林县|