如何让 GORM 打印 SQL 语句?三种方式全解析
前言在使用 GORM 开发 Go 项目时经常需要查看实际执行的 SQL 语句——排查慢查询、调试数据逻辑、确认查询条件是否正确……但 GORM 默认是关闭的不会主动把 SQL 打印出来。方式一全局开启 Debug 模式(最简单)GORM 提供了一个非常方便的方法——db.Debug()它会把所有SQL 语句打印到标准输出包括执行的 SQL、影响的行数和耗时。只需一行代码db db.Debug()之后所有的查询都会打印 SQL例如[0.23ms] [rows:1] SELECT * FROM users WHERE id 1适合场景开发环境整体调试想看全局 SQL 的情况。实际项目中怎么做通常会用一个环境变量来控制。初始化数据库连接时func InitDB() { db, err : gorm.Open(mysql.Open(dsn), gorm.Config{}) if os.Getenv(DEBUG) true { db db.Debug() // 只有 DEBUGtrue 时才开启 } DB db }启动服务时加上环境变量即可DEBUGtrue ./my-app这样生产环境不会误打印开发环境一键开启非常灵活。方式二单条查询临时 Debug(最精准)如果全局打印太多你只想看某一条SQL可以在查询链上临时加.Debug()// 只打印这条查询的 SQL db.Debug().Where(status ?, 1).Find(users) // 其他查询不受影响 db.Where(role ?, admin).Find(admins) // 这条不会打印适合场景只想排查某个特定查询不想被大量日志淹没。这种方式非常轻量不需要改任何配置用完把.Debug()删掉就行。方式三自定义 Logger(最专业)如果你需要更精细的控制——比如只想打印慢查询、想把 SQL 写到文件而不是终端、想在日志中加上请求ID等上下文——就需要自定义 GORM 的 Logger。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超过这个时间的查询会被标记为慢查询单独警示LogLevelSilent不打印、Error只打印错误、Warn打印错误慢查询、Info打印所有IgnoreRecordNotFoundError是否忽略 记录未找到 这种常见错误(避免日志刷屏)Colorful终端输出是否带颜色方便区分不同级别适合场景生产环境监控、慢查询分析、日志持久化到文件等进阶需求。三种方式对比方式影响范围使用难度适用场景全局db.Debug()所有 SQL★☆☆开发环境整体调试单条.Debug()仅该条查询★☆☆临时排查某条查询自定义 Logger可精细控制★★★生产环境/慢查询监控小结日常开发中方式一 方式二就够用了全局 Debug 看整体单条 Debug 看细节。当你需要上生产环境做监控时再考虑方式三自定义 Logger。