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

golang?gorm錯誤處理事務以及日志用法示例

 更新時間:2022年04月15日 17:06:09   作者:Jeff的技術棧  
這篇文章主要為大家介紹了golang?gorm錯誤處理事務以及日志用法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪

1. 高級用法

1.1. 錯誤處理

執(zhí)行任何操作后,如果發(fā)生任何錯誤,GORM將其設置為*DBError字段

if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil {
    // 錯誤處理...
}
// 如果有多個錯誤發(fā)生,用`GetErrors`獲取所有的錯誤,它返回`[]error`
db.First(&user).Limit(10).Find(&users).GetErrors()
// 檢查是否返回RecordNotFound錯誤
db.Where("name = ?", "hello world").First(&user).RecordNotFound()
if db.Model(&user).Related(&credit_card).RecordNotFound() {
    // 沒有信用卡被發(fā)現處理...
}

1.2. 事物

要在事務中執(zhí)行一組操作,一般流程如下。

// 開始事務
tx := db.Begin()
// 在事務中做一些數據庫操作(從這一點使用'tx',而不是'db')
tx.Create(...)
// ...
// 發(fā)生錯誤時回滾事務
tx.Rollback()
// 或提交事務
tx.Commit()

1.2.1. 一個具體的例子

func CreateAnimals(db *gorm.DB) err {
  tx := db.Begin()
  // 注意,一旦你在一個事務中,使用tx作為數據庫句柄
  if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
     tx.Rollback()
     return err
  }
  if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
     tx.Rollback()
     return err
  }
  tx.Commit()
  return nil
}

1.3. SQL構建

1.3.1. 執(zhí)行原生SQL

db.Exec("DROP TABLE users;")
db.Exec("UPDATE orders SET shipped_at=? WHERE id IN (?)", time.Now, []int64{11,22,33})
// Scan
type Result struct {
    Name string
    Age  int
}
var result Result
db.Raw("SELECT name, age FROM users WHERE name = ?", 3).Scan(&result)

1.3.2. sql.Row & sql.Rows

獲取查詢結果為*sql.Row*sql.Rows

row := db.Table("users").Where("name = ?", "jinzhu").Select("name, age").Row() // (*sql.Row)
row.Scan(&name, &age)
rows, err := db.Model(&User{}).Where("name = ?", "jinzhu").Select("name, age, email").Rows() // (*sql.Rows, error)
defer rows.Close()
for rows.Next() {
    ...
    rows.Scan(&name, &age, &email)
    ...
}
// Raw SQL
rows, err := db.Raw("select name, age, email from users where name = ?", "jinzhu").Rows() // (*sql.Rows, error)
defer rows.Close()
for rows.Next() {
    ...
    rows.Scan(&name, &age, &email)
    ...
}

1.3.3. 迭代中使用sql.Rows的Scan

rows, err := db.Model(&User{}).Where("name = ?", "jinzhu").Select("name, age, email").Rows() // (*sql.Rows, error)
defer rows.Close()
for rows.Next() {
  var user User
  db.ScanRows(rows, &user)
  // do something
}

1.4. 通用數據庫接口sql.DB

*gorm.DB連接獲取通用數據庫接口*sql.DB

// 獲取通用數據庫對象`*sql.DB`以使用其函數
db.DB()
// Ping
db.DB().Ping()

1.4.1. 連接池

db.DB().SetMaxIdleConns(10)
db.DB().SetMaxOpenConns(100)

1.5. 復合主鍵

將多個字段設置為主鍵以啟用復合主鍵

type Product struct {
    ID           string `gorm:"primary_key"`
    LanguageCode string `gorm:"primary_key"`
}

1.6. 日志

Gorm有內置的日志記錄器支持,默認情況下,它會打印發(fā)生的錯誤

// 啟用Logger,顯示詳細日志
db.LogMode(true)
// 禁用日志記錄器,不顯示任何日志
db.LogMode(false)
// 調試單個操作,顯示此操作的詳細日志
db.Debug().Where("name = ?", "jinzhu").First(&User{})

1.6.1. 自定義日志

參考GORM的默認記錄器如何自定義它

db.SetLogger(gorm.Logger{revel.TRACE})
db.SetLogger(log.New(os.Stdout, "\r\n", 0))

以上就是golang gorm錯誤處理事務以及日志用法示例的詳細內容,更多關于golang gorm錯誤處理事務日志示例的資料請關注腳本之家其它相關文章!

相關文章

  • 一文帶你了解Go語言中的類型斷言和類型轉換

    一文帶你了解Go語言中的類型斷言和類型轉換

    在Go中,類型斷言和類型轉換是一個令人困惑的事情,他們似乎都在做同樣的事情。最明顯的不同點是他們具有不同的語法(variable.(type)?vs?type(variable)?)。本文我們就來深入研究一下二者的區(qū)別
    2022-09-09
  • 詳解Golang 推薦的命名規(guī)范

    詳解Golang 推薦的命名規(guī)范

    這篇文章主要介紹了詳解Golang 推薦的命名規(guī)范,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • golang中map增刪改查的示例代碼

    golang中map增刪改查的示例代碼

    在Go語言中,map是一種內置的數據結構,用于存儲鍵值對,本文主要介紹了golang中map增刪改查的示例代碼,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Go語言實現LRU算法的核心思想和實現過程

    Go語言實現LRU算法的核心思想和實現過程

    這篇文章主要介紹了Go語言實現LRU算法的核心思想和實現過程,LRU算法是一種常用的緩存淘汰策略,它的核心思想是如果一個數據在最近一段時間內沒有被訪問到,那么在將來它被訪問的可能性也很小,因此可以將其淘汰,感興趣想要詳細了解可以參考下文
    2023-05-05
  • Golang內存模型教科書級講解

    Golang內存模型教科書級講解

    go官方介紹go內存模型的時候說:探究在什么條件下,goroutine?在讀取一個變量的值的時,能夠看到其它?goroutine?對這個變量進行的寫的結果,Go內存模型規(guī)定了一些條件,在這些條件下,在一個goroutine中讀取變量返回的值能夠確保是另一個goroutine中對該變量寫入的值
    2023-03-03
  • 淺談Go1.18中的泛型編程

    淺談Go1.18中的泛型編程

    本文主要介紹了Go1.18中的泛型編程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Go語言使用Gob傳輸數據

    Go語言使用Gob傳輸數據

    本文主要介紹了Go語言使用Gob傳輸數據,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • golang 檢查網絡狀態(tài)是否正常的方法

    golang 檢查網絡狀態(tài)是否正常的方法

    今天小編就為大家分享一篇golang 檢查網絡狀態(tài)是否正常的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Go Map并發(fā)沖突預防與解決

    Go Map并發(fā)沖突預防與解決

    這篇文章主要為大家介紹了Go Map并發(fā)沖突預防與解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 基于go interface{}==nil 的幾種坑及原理分析

    基于go interface{}==nil 的幾種坑及原理分析

    這篇文章主要介紹了基于go interface{}==nil 的幾種坑及原理分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評論

湘西| 遂平县| 盘山县| 太白县| 龙门县| 蒙自县| 山阴县| 故城县| 三江| 修文县| 伊春市| 清新县| 广丰县| 大连市| 盈江县| 岗巴县| 绥中县| 河曲县| 麻栗坡县| 蓬安县| 定远县| 通海县| 文水县| 土默特左旗| 淮安市| 南和县| 大竹县| 磐安县| 西吉县| 漠河县| 郎溪县| 琼中| 三明市| 平乡县| 泾源县| 崇仁县| 安岳县| 峨山| 宜春市| 雅江县| 大化|