欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

參考 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í)間戳與日期格式化操作

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

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

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

    使用Go?http重試請(qǐng)求的示例

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

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

    Go?defer中改變r(jià)eturn的值會(huì)生效嗎,這就設(shè)計(jì)到了GO語(yǔ)言中defer與return哪個(gè)先執(zhí)行的問(wèn)題了,下面小編就通過(guò)簡(jiǎn)單的示例來(lái)和大家講講吧
    2023-07-07
  • go-zero過(guò)載保護(hù)源碼解讀

    go-zero過(guò)載保護(hù)源碼解讀

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

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

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

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

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

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

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

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

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

    Go語(yǔ)言中你不知道的Interface詳解

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

最新評(píng)論