最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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 有一個 默認(rèn) logger 實現(xiàn),默認(rèn)情況下,它會打印慢 SQL 和錯誤。

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

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

1. 使用 Debug 方法

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

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

Debug 單個操作時,會將當(dāng)前操作的 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 的 默認(rèn) 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的defer的使用

    聊聊golang的defer的使用

    這篇文章主要介紹了聊聊golang的defer的使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 一文精通管理多版本Go安裝教程

    一文精通管理多版本Go安裝教程

    這篇文章主要為大家介紹了一文精通管理多版本Go安裝教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2024-01-01
  • Go語言defer的一些神奇規(guī)則示例詳解

    Go語言defer的一些神奇規(guī)則示例詳解

    這篇文章主要為大家介紹了Go語言defer的一些神奇規(guī)則示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 在Go程序中實現(xiàn)服務(wù)器重啟的方法

    在Go程序中實現(xiàn)服務(wù)器重啟的方法

    這篇文章主要介紹了在Go程序中實現(xiàn)服務(wù)器重啟的方法,由于很多人盲目崇拜谷歌"親爹",Go語言在國內(nèi)有著不尋常的人氣,需要的朋友可以參考下
    2015-06-06
  • 一文詳解Golang中的切片數(shù)據(jù)類型

    一文詳解Golang中的切片數(shù)據(jù)類型

    這篇文章主要介紹了一文詳解Golang中的切片數(shù)據(jù)類型,切片是一個種特殊的數(shù)組。是對數(shù)組的一個連續(xù)片段的引用,所以切片是一個引用類型
    2022-09-09
  • Golang 1.16 中 Modules的主要變化更新

    Golang 1.16 中 Modules的主要變化更新

    這篇文章主要介紹了Golang 1.16 中 Modules的主要變化更新,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • golang連接池檢查連接失敗時如何重試(示例代碼)

    golang連接池檢查連接失敗時如何重試(示例代碼)

    在Go中,可以通過使用database/sql包的DB類型的Ping方法來檢查數(shù)據(jù)庫連接的可用性,本文通過示例代碼,演示了如何在連接檢查失敗時進行重試,感興趣的朋友一起看看吧
    2023-10-10
  • 詳解Golang time包中的結(jié)構(gòu)體time.Time

    詳解Golang time包中的結(jié)構(gòu)體time.Time

    在日常開發(fā)過程中,會頻繁遇到對時間進行操作的場景,使用 Golang 中的 time 包可以很方便地實現(xiàn)對時間的相關(guān)操作,本文先講解一下 time 包中的結(jié)構(gòu)體 time.Time,需要的朋友可以參考下
    2023-07-07
  • 關(guān)于golang監(jiān)聽rabbitmq消息隊列任務(wù)斷線自動重連接的問題

    關(guān)于golang監(jiān)聽rabbitmq消息隊列任務(wù)斷線自動重連接的問題

    這篇文章主要介紹了golang監(jiān)聽rabbitmq消息隊列任務(wù)斷線自動重連接,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • Go語言使用slices包輕松實現(xiàn)排序功能

    Go語言使用slices包輕松實現(xiàn)排序功能

    在 Go 語言開發(fā)中,對數(shù)據(jù)進行排序是常見的需求,Go 1.18 版本引入的 slices包提供了簡潔高效的排序解決方案,支持內(nèi)置類型和用戶自定義類型的排序操作,本文將通過具體示例,詳細介紹如何使用 slices包實現(xiàn)排序及相關(guān)功能,需要的朋友可以參考下
    2025-05-05

最新評論

靖江市| 石柱| 平湖市| 加查县| 北安市| 新竹县| 荆州市| 博客| 扶绥县| 安陆市| 浙江省| 汝阳县| 会宁县| 汽车| 榆社县| 城步| 龙陵县| 额敏县| 上林县| 灵川县| 丹凤县| 德兴市| 龙山县| 舒城县| 福安市| 临西县| 汾阳市| 仙游县| 乌苏市| 道孚县| 辽阳市| 十堰市| 黑龙江省| 汉川市| 克什克腾旗| 安宁市| 阿巴嘎旗| 涞源县| 喀喇| 托克托县| 仙桃市|