Golang開發(fā)使用gorm時(shí)打印SQL語(yǔ)句方式
參考 gorm 文檔:https://gorm.io/zh_CN/docs/logger.html
Gorm
有一個(gè) 默認(rèn) logger 實(shí)現(xiàn),默認(rèn)情況下,它會(huì)打印慢 SQL 和錯(cuò)誤。
如果想要全部或部分打印 SQL 的話可以通過(guò)設(shè)置日志級(jí)別和使用 Logger
接口來(lái)實(shí)現(xiàn)自定義處理。
以下是一些方法來(lái)實(shí)現(xiàn)這個(gè)功能。
1. 使用 Debug 方法
GORM 提供了一個(gè) Debug
方法,可以在鏈?zhǔn)秸{(diào)用中打印出生成的 SQL 語(yǔ)句和執(zhí)行時(shí)間。
一般用于開發(fā)或者是線上排查某個(gè)問(wèn)題時(shí)使用。
Debug 單個(gè)操作時(shí),會(huì)將當(dāng)前操作的 log 級(jí)別調(diào)整為 logger.Info
代碼示例:
package main import ( "fmt" "gorm.io/driver/mysql" "gorm.io/gorm" ) type User struct { ID int Name string } func main() { dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("failed to connect database") } var users []User // 使用 Debug() 方法 db.Debug().Where("name = ?", "John").Find(&users) fmt.Println(users) }
2. 全局設(shè)置日志級(jí)別
在 GORM 配置中設(shè)置 Logger
,可以全局打印 SQL 語(yǔ)句??梢允褂?gorm/logger
包來(lái)設(shè)置日志級(jí)別。
GORM 定義了這些日志級(jí)別:
Silent
:不打印任何日志。Error
:僅打印錯(cuò)誤日志。Warn
:打印警告和錯(cuò)誤日志。Info
:打印所有日志(包括 SQL 語(yǔ)句和運(yùn)行時(shí)間)
代碼示例:
package main import ( "log" "time" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) type User struct { ID int Name string } func main() { dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" newLogger := logger.New( log.New(log.Writer(), "\r\n", log.LstdFlags), // io writer logger.Config{ SlowThreshold: time.Second, // 慢 SQL 閾值 LogLevel: logger.Info, // 日志級(jí)別 IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(記錄未找到)錯(cuò)誤 Colorful: true, // 啟用彩色打印 }, ) db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: newLogger, }) if err != nil { panic("failed to connect database") } var users []User db.Where("name = ?", "John").Find(&users) fmt.Println(users) }
3. 自定義 Logger
如果需要更復(fù)雜的日志邏輯,可以實(shí)現(xiàn) gorm/logger
包中的 Interface
接口,來(lái)自定義 Logger。
參考 GORM 的 默認(rèn) logger 來(lái)定義您自己的 logger
代碼示例:
package main import ( "log" "time" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/utils" ) type CustomLogger struct { logger.Interface } func (c *CustomLogger) Info(ctx context.Context, msg string, data ...interface{}) { log.Printf("[INFO] "+msg, data...) } func (c *CustomLogger) Warn(ctx context.Context, msg string, data ...interface{}) { log.Printf("[WARN] "+msg, data...) } func (c *CustomLogger) Error(ctx context.Context, msg string, data ...interface{}) { log.Printf("[ERROR] "+msg, data...) } // 追蹤并輸出 sql 的詳細(xì)信息:sql 語(yǔ)句、綁定的參數(shù)、執(zhí)行時(shí)間等。 func (c *CustomLogger) Trace(ctx context.Context, begin time.Time, fc func() (string, int64), err error) { elapsed := time.Since(begin) sql, rows := fc() log.Printf("[SQL] %s [rows:%d] [elapsed:%s] [error:%v]\n", sql, rows, elapsed, err) } func main() { dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local" customLogger := &CustomLogger{} db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: customLogger, }) if err != nil { panic("failed to connect database") } var users []User db.Where("name = ?", "John").Find(&users) fmt.Println(users) }
總結(jié)
通過(guò)上述方法,可以在 GORM 中實(shí)現(xiàn) SQL 語(yǔ)句的打印,從而方便調(diào)試和監(jiān)控?cái)?shù)據(jù)庫(kù)操作。
根據(jù)具體需求,可以選擇使用 Debug
模式、全局設(shè)置日志級(jí)別或者自定義 Logger
。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
golang 使用time包獲取時(shí)間戳與日期格式化操作
這篇文章主要介紹了golang 使用time包獲取時(shí)間戳與日期格式化操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12Golang?int函數(shù)使用實(shí)例全面教程
這篇文章主要為大家介紹了Golang?int函數(shù)使用實(shí)例全面教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10go-micro開發(fā)RPC服務(wù)以及運(yùn)行原理介紹
這篇文章介紹了go-micro開發(fā)RPC服務(wù)的方法及其運(yùn)行原理,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07