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

news/2024/11/14 12:43:10/

目录

  • 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 mainimport ("fmt""gorm.io/driver/mysql""gorm.io/gorm"
)type User struct {ID   intName 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 mainimport ("log""time""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger"
)type User struct {ID   intName 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 writerlogger.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 []Userdb.Where("name = ?", "John").Find(&users)fmt.Println(users)
}

3. 自定义 Logger

如果需要更复杂的日志逻辑,可以实现 gorm/logger 包中的 Interface 接口,来自定义 Logger。

参考 GORM 的 默认 logger 来定义您自己的 logger

代码示例

package mainimport ("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 []Userdb.Where("name = ?", "John").Find(&users)fmt.Println(users)
}

4. 总结

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


http://www.ppmy.cn/news/1518888.html

相关文章

spring security 相关过滤器

Spring Security 提供了 30 多个过滤器。默认情况下Spring Boot 在对 SpringSecurity 进入自动化配置时,会创建一个名为 SpringSecurityFilerChain 的过滤器,并注入到Spring容器中,这个过滤器将负责所有的安全管理,包括用户认证、…

EmguCV学习笔记 VB.Net 9.1 VideoCapture类

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

代理模式 JAVA

文章目录 涉及的JAVA语言特性接口和转型接口(Interface)接口的特点:示例代码: 转型(类型转换)接口与转型的关系多态与接口的结合 总结 UML代理模型动态代理模式Springboot项目中遇到的代理模式 涉及的JAVA语…

Unity编辑器开发 Immediate Mode GUI (IMGUI)

1. 简介: IMGUI是代码驱动gui系统,由 OnGUI 函数驱动: void OnGUI() {if (GUILayout.Button("Press Me")){ Debug.Log("Hello!");} } IMGUI常用于: 创建 in-game debugging displays and tools&#xff1b…

PostgreSQL主从同步介绍

PostgreSQL主从同步介绍 PostgreSQL 主从同步(也称为流复制)的原理是基于基于日志的复制机制(Write-Ahead Logging, WAL)进行的。这种机制使得数据在主数据库(Primary)和从数据库(Standby&…

vue3 使用vue-masonry加载更多,重新渲染

在使用 van-list做上拉加载更多,加载下一页的时候,会出现瀑布图重叠,原因是布局没有重新更新,所以需要 调用 vue-masonry更新布局的方法。 看了源码才知道可以这样用,api都没写,隐藏太深了。。。 vue3中通…

裸机:LCD

什么是LCD? LCD,全称为Liquid Crystal Display,即液晶显示屏,是一种利用液晶物质的光学特性,通过控制电场来改变光的透过性,从而实现图像显示的技术。以下是关于LCD的详细解释: 一、LCD的基本…

模糊视频一键变清晰,从此告别模糊不清的画质

话不多说,咱们直入主题。你是不是有比较模糊的视频,比如老视频,老电影和监控视频,对了,还有日本土特产(懂的都懂),模糊的视频看起是不是很不舒服,长期久了还会影响视力影…