如何让 GORM 打印 SQL 语句?三种方式全解析

前言

在使用 GORM 开发 Go 项目时,经常需要查看实际执行的 SQL 语句------排查慢查询、调试数据逻辑、确认查询条件是否正确......但 GORM 默认是关闭的,不会主动把 SQL 打印出来。


方式一:全局开启 Debug 模式(最简单)

GORM 提供了一个非常方便的方法------db.Debug(),它会把所有 SQL 语句打印到标准输出,包括执行的 SQL、影响的行数和耗时。

只需一行代码:

go 复制代码
db = db.Debug()

之后所有的查询都会打印 SQL,例如:

复制代码
[0.23ms] [rows:1] SELECT * FROM `users` WHERE `id` = 1

适合场景: 开发环境整体调试,想看全局 SQL 的情况。

实际项目中怎么做? 通常会用一个环境变量来控制。初始化数据库连接时:

go 复制代码
func InitDB() {
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    if os.Getenv("DEBUG") == "true" {
        db = db.Debug()  // 只有 DEBUG=true 时才开启
    }
    DB = db
}

启动服务时加上环境变量即可:

bash 复制代码
DEBUG=true ./my-app

这样生产环境不会误打印,开发环境一键开启,非常灵活。


方式二:单条查询临时 Debug(最精准)

如果全局打印太多,你只想看某一条 SQL,可以在查询链上临时加 .Debug()

go 复制代码
// 只打印这条查询的 SQL
db.Debug().Where("status = ?", 1).Find(&users)

// 其他查询不受影响
db.Where("role = ?", "admin").Find(&admins)  // 这条不会打印

适合场景: 只想排查某个特定查询,不想被大量日志淹没。

这种方式非常轻量,不需要改任何配置,用完把 .Debug() 删掉就行。


方式三:自定义 Logger(最专业)

如果你需要更精细的控制------比如只想打印慢查询、想把 SQL 写到文件而不是终端、想在日志中加上请求ID等上下文------就需要自定义 GORM 的 Logger。

go 复制代码
import (
    "log"
    "os"
    "time"
    "gorm.io/gorm/logger"
)

newLogger := logger.New(
    log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer
    logger.Config{
        SlowThreshold:             200 * time.Millisecond, // 慢查询阈值
        LogLevel:                  logger.Info,            // 日志级别
        IgnoreRecordNotFoundError: true,                   // 忽略 ErrRecordNotFound
        Colorful:                  true,                   // 彩色打印
    },
)

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
    Logger: newLogger,
})

关键参数解释:

参数 作用
SlowThreshold 超过这个时间的查询会被标记为慢查询,单独警示
LogLevel Silent 不打印、Error 只打印错误、Warn 打印错误+慢查询、Info 打印所有
IgnoreRecordNotFoundError 是否忽略 "记录未找到" 这种常见错误(避免日志刷屏)
Colorful 终端输出是否带颜色,方便区分不同级别

适合场景: 生产环境监控、慢查询分析、日志持久化到文件等进阶需求。


三种方式对比

方式 影响范围 使用难度 适用场景
全局 db.Debug() 所有 SQL ★☆☆ 开发环境整体调试
单条 .Debug() 仅该条查询 ★☆☆ 临时排查某条查询
自定义 Logger 可精细控制 ★★★ 生产环境/慢查询监控

小结

日常开发中,方式一 + 方式二 就够用了:全局 Debug 看整体,单条 Debug 看细节。当你需要上生产环境做监控时,再考虑方式三自定义 Logger。

相关推荐
AI-好学者6 小时前
阶段一-图数据库基础与PropertyGraph模型
数据库·rag·knowledge graph·graphrag
其实防守也摸鱼7 小时前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚7 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
龙仔7257 小时前
SQL Server 创建只读账号完整操作(分两种场景:SSMS图形界面 + T-SQL脚本)
数据库·sql·oracle
霁月的小屋8 小时前
生产环境中的事务实践——银行系统上线记(四)
数据库
Database_Cool_8 小时前
AI 应用数据底座首选:阿里云 PolarDB 为大模型 RAG 提供一体化支撑
数据库·阿里云
玖玥拾8 小时前
C# 语言进阶(十五)C# 游戏服务端 MySQL 数据库
服务器·开发语言·网络·数据库·mysql·c#
IvorySQL9 小时前
PG 日报|社区讨论重构 pg_hba 配置文件格式
数据库·人工智能·postgresql·重构·ivorysql
逝水无殇10 小时前
C# 文件的输入与输出详解
开发语言·数据库·后端·c#
罗政11 小时前
PDF 批量合并工具:本地 AI 自动排序、识别正文日期与合同编号
数据库·pdf·php