溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang?gorm錯誤處理事務及日志的使用方法

發(fā)布時間:2022-04-16 09:07:02 來源:億速云 閱讀:257 作者:iii 欄目:開發(fā)技術

這篇文章主要講解了“golang gorm錯誤處理事務及日志的使用方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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. 自定義日志

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

感謝各位的閱讀,以上就是“golang gorm錯誤處理事務及日志的使用方法”的內容了,經過本文的學習后,相信大家對golang gorm錯誤處理事務及日志的使用方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI