当前位置: 首页 > article >正文

Golang 开发使用 gorm 时打印 SQL 语句

目录

  • 1. 使用 Debug 方法
  • 2. 全局设置日志级别
  • 3. 自定义 Logger
  • 4. 总结

参考 gorm 文档:https://gorm.io/zh_CN/docs/logger.html

Gorm 有一个 默认 logger 实现,默认情况下,它会打印慢 SQL 和错误。如果想要全部或部分打印 SQL 的话可以通过设置日志级别和使用 Logger 接口来实现自定义处理。以下是一些方法来实现这个功能。

1. 使用 Debug 方法

GORM 提供了一个 Debug 方法,可以在链式调用中打印出生成的 SQL 语句和执行时间。

一般用于开发或者是线上排查某个问题时使用。

Debug 单个操作时,会将当前操作的 log 级别调整为 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. 全局设置日志级别

在 GORM 配置中设置 Logger,可以全局打印 SQL 语句。可以使用 gorm/logger 包来设置日志级别。

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

如果需要更复杂的日志逻辑,可以实现 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 语句、绑定的参数、执行时间等。
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)
}

4. 总结

通过上述方法,可以在 GORM 中实现 SQL 语句的打印,从而方便调试和监控数据库操作。根据具体需求,可以选择使用 Debug 模式、全局设置日志级别或者自定义 Logger


http://www.kler.cn/a/286682.html

相关文章:

  • linux如何修改密码,要在CentOS 7系统中修改密码
  • 【FFmpeg】FLV 格式分析 ③ ( Tag Body 数据块体结构 - Vedio Data 视频数据 )
  • 中国综合算力指数(2024年)报告汇总PDF洞察(附原数据表)
  • Go Fx 和 Java Spring 的区别
  • 运算放大器应用电路设计笔记(六)
  • 移动端VR处理器和传统显卡的不同
  • 基于nodejs+vue+uniapp的摄影竞赛小程序
  • 【MCAL】TC397+EB-tresos之SPI配置实战 - (同步/异步)
  • python从谷歌地图获取经纬度坐标之间的导航信息
  • 【KingbaseES 人大金仓】| Docker 部署 | 详细步骤
  • (mcu) 嵌入式基础简单入门(程序架构分析)
  • Python自适应光学模态星形小波分析和像差算法
  • 碎碎恋之懒加载和预加载
  • 【Tools】Apache Spark 的基本概念和在大数据分析中的应用
  • 基于BP神经网络的项目风险识别,BP神经网络训练窗口详解,BP神经网络详细原理
  • mac iterm2 rz sz 无法上传下载问题
  • 深度学习系列73:使用rapidStructure进行版面分析
  • k3s安装部署说明
  • Bean 的实例化(创建 | 获取)
  • Prometheus和Grafana构建现代服务器监控体系
  • 数据结构之最短路径
  • RAG+知识图谱
  • Linux 背景、命令
  • JAVAEE初阶第一节——计算机的工作原理
  • C++国密SM2算法加解密的使用
  • vue3+elementplus的表格展示和分页实战