golang?gorm錯(cuò)誤處理事務(wù)以及日志用法示例
1. 高級(jí)用法
1.1. 錯(cuò)誤處理
執(zhí)行任何操作后,如果發(fā)生任何錯(cuò)誤,GORM將其設(shè)置為*DB
的Error
字段
if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil { // 錯(cuò)誤處理... } // 如果有多個(gè)錯(cuò)誤發(fā)生,用`GetErrors`獲取所有的錯(cuò)誤,它返回`[]error` db.First(&user).Limit(10).Find(&users).GetErrors() // 檢查是否返回RecordNotFound錯(cuò)誤 db.Where("name = ?", "hello world").First(&user).RecordNotFound() if db.Model(&user).Related(&credit_card).RecordNotFound() { // 沒(méi)有信用卡被發(fā)現(xiàn)處理... }
1.2. 事物
要在事務(wù)中執(zhí)行一組操作,一般流程如下。
// 開始事務(wù) tx := db.Begin() // 在事務(wù)中做一些數(shù)據(jù)庫(kù)操作(從這一點(diǎn)使用'tx',而不是'db') tx.Create(...) // ... // 發(fā)生錯(cuò)誤時(shí)回滾事務(wù) tx.Rollback() // 或提交事務(wù) tx.Commit()
1.2.1. 一個(gè)具體的例子
func CreateAnimals(db *gorm.DB) err { tx := db.Begin() // 注意,一旦你在一個(gè)事務(wù)中,使用tx作為數(shù)據(jù)庫(kù)句柄 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構(gòu)建
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
獲取查詢結(jié)果為*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. 通用數(shù)據(jù)庫(kù)接口sql.DB
從*gorm.DB
連接獲取通用數(shù)據(jù)庫(kù)接口*sql.DB
// 獲取通用數(shù)據(jù)庫(kù)對(duì)象`*sql.DB`以使用其函數(shù) db.DB() // Ping db.DB().Ping()
1.4.1. 連接池
db.DB().SetMaxIdleConns(10) db.DB().SetMaxOpenConns(100)
1.5. 復(fù)合主鍵
將多個(gè)字段設(shè)置為主鍵以啟用復(fù)合主鍵
type Product struct { ID string `gorm:"primary_key"` LanguageCode string `gorm:"primary_key"` }
1.6. 日志
Gorm有內(nèi)置的日志記錄器支持,默認(rèn)情況下,它會(huì)打印發(fā)生的錯(cuò)誤
// 啟用Logger,顯示詳細(xì)日志 db.LogMode(true) // 禁用日志記錄器,不顯示任何日志 db.LogMode(false) // 調(diào)試單個(gè)操作,顯示此操作的詳細(xì)日志 db.Debug().Where("name = ?", "jinzhu").First(&User{})
1.6.1. 自定義日志
參考GORM的默認(rèn)記錄器如何自定義它
db.SetLogger(gorm.Logger{revel.TRACE}) db.SetLogger(log.New(os.Stdout, "\r\n", 0))
以上就是golang gorm錯(cuò)誤處理事務(wù)以及日志用法示例的詳細(xì)內(nèi)容,更多關(guān)于golang gorm錯(cuò)誤處理事務(wù)日志示例的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
golang?gorm實(shí)現(xiàn)get請(qǐng)求查詢案例測(cè)試
這篇文章主要為大家介紹了golang?gorm實(shí)現(xiàn)get請(qǐng)求查詢案例測(cè)試,2022-04-04Golang 使用Map實(shí)現(xiàn)去重與set的功能操作
這篇文章主要介紹了Golang 使用 Map 實(shí)現(xiàn)去重與 set 的功能操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04Go語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之二叉樹必會(huì)知識(shí)點(diǎn)總結(jié)
如果你是一個(gè)開發(fā)人員,或多或少對(duì)樹型結(jié)構(gòu)都有一定的認(rèn)識(shí)。二叉樹作為樹的一種,是一種重要的數(shù)據(jù)結(jié)構(gòu),也是面試官經(jīng)??嫉臇|西。本文為大家總結(jié)了一些二叉樹必會(huì)知識(shí)點(diǎn),需要的可以參考一下2022-08-08Go語(yǔ)言中函數(shù)的參數(shù)傳遞與調(diào)用的基本方法
這篇文章主要介紹了Go語(yǔ)言中函數(shù)的參數(shù)傳遞與調(diào)用的基本方法,是golang入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10