亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang開發(fā)使用gorm時打印SQL語句方式

 更新時間:2025年04月30日 10:08:41   作者:Roc.Chang  
這篇文章主要介紹了Golang開發(fā)使用gorm時打印SQL語句方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

參考 gorm 文檔:https://gorm.io/zh_CN/docs/logger.html

Gorm 有一個 默認 logger 實現(xiàn),默認情況下,它會打印慢 SQL 和錯誤。

如果想要全部或部分打印 SQL 的話可以通過設(shè)置日志級別和使用 Logger 接口來實現(xiàn)自定義處理。

以下是一些方法來實現(xiàn)這個功能。

1. 使用 Debug 方法

GORM 提供了一個 Debug 方法,可以在鏈式調(diào)用中打印出生成的 SQL 語句和執(zhí)行時間。

一般用于開發(fā)或者是線上排查某個問題時使用。

Debug 單個操作時,會將當前操作的 log 級別調(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è)置日志級別

在 GORM 配置中設(shè)置 Logger,可以全局打印 SQL 語句??梢允褂?gorm/logger 包來設(shè)置日志級別。

GORM 定義了這些日志級別:

  • Silent:不打印任何日志。
  • Error:僅打印錯誤日志。
  • Warn:打印警告和錯誤日志。
  • Info:打印所有日志(包括 SQL 語句和運行時間)

代碼示例

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,   // 日志級別
            IgnoreRecordNotFoundError: true, // 忽略ErrRecordNotFound(記錄未找到)錯誤
            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ù)雜的日志邏輯,可以實現(xiàn) gorm/logger 包中的 Interface 接口,來自定義 Logger。

參考 GORM 的 默認 logger 來定義您自己的 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 的詳細信息:sql 語句、綁定的參數(shù)、執(zhí)行時間等。
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é)

通過上述方法,可以在 GORM 中實現(xiàn) SQL 語句的打印,從而方便調(diào)試和監(jiān)控數(shù)據(jù)庫操作。

根據(jù)具體需求,可以選擇使用 Debug 模式、全局設(shè)置日志級別或者自定義 Logger。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • golang 使用time包獲取時間戳與日期格式化操作

    golang 使用time包獲取時間戳與日期格式化操作

    這篇文章主要介紹了golang 使用time包獲取時間戳與日期格式化操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Golang?int函數(shù)使用實例全面教程

    Golang?int函數(shù)使用實例全面教程

    這篇文章主要為大家介紹了Golang?int函數(shù)使用實例全面教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 使用Go?http重試請求的示例

    使用Go?http重試請求的示例

    開發(fā)中對于http請求是經(jīng)常遇到,一般可能網(wǎng)絡(luò)延遲或接口返回超時,這篇文章主要介紹了使用Go?http重試請求的示例,需要的朋友可以參考下
    2022-08-08
  • 詳解Go中defer與return的執(zhí)行順序

    詳解Go中defer與return的執(zhí)行順序

    Go?defer中改變return的值會生效嗎,這就設(shè)計到了GO語言中defer與return哪個先執(zhí)行的問題了,下面小編就通過簡單的示例來和大家講講吧
    2023-07-07
  • go-zero過載保護源碼解讀

    go-zero過載保護源碼解讀

    這篇文章主要為大家介紹了go-zero過載保護源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • golang panic 函數(shù)用法示例詳解

    golang panic 函數(shù)用法示例詳解

    在Go語言中,panic用于觸發(fā)不可恢復(fù)的錯誤,終止函數(shù)執(zhí)行并逐層向上觸發(fā)defer,最終若未被recover捕獲,程序會崩潰,recover用于在defer函數(shù)中捕獲panic,恢復(fù)程序流程,建議優(yōu)先返回error,僅在嚴重錯誤或不可恢復(fù)場景下使用panic,并在關(guān)鍵位置recover,感興趣的朋友一起看看吧
    2025-03-03
  • Go語言刪除文本文件中的指定行操作代碼

    Go語言刪除文本文件中的指定行操作代碼

    假設(shè)現(xiàn)在有一個文本文件,我們需要刪除文件中亂碼的行。我們可以使用go的os庫來處理文件,遍歷整個文件然后將除過亂碼的行寫入一個新文件,以此來實現(xiàn)我們的需求,這篇文章主要介紹了Go語言刪除文本文件中的指定行,需要的朋友可以參考下
    2023-12-12
  • go-micro開發(fā)RPC服務(wù)以及運行原理介紹

    go-micro開發(fā)RPC服務(wù)以及運行原理介紹

    這篇文章介紹了go-micro開發(fā)RPC服務(wù)的方法及其運行原理,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • go下載指定版本的依賴包圖文詳解

    go下載指定版本的依賴包圖文詳解

    由于依賴包的每個版本都有一個唯一的目錄,所以在多項目場景中需要使用同一個依賴包的多版本時才不會產(chǎn)生沖突,下面這篇文章主要給大家介紹了關(guān)于go下載指定版本的依賴包的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Go語言中你不知道的Interface詳解

    Go語言中你不知道的Interface詳解

    對于go語言來說,設(shè)計最精妙的應(yīng)該是interface了,直白點說interface是一組method的組合。下面這篇文章主要給大家介紹了關(guān)于Go語言中你不知道的Interface的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2018-02-02

最新評論