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

gorm 1.X db日志 SELECT count(*) FROM “users“ WHERE “users“.“deleted_at“ IS NULL AND ((id = $1)) LIMIT

这个 GORM 1.x 的 SQL 日志问题。

问题现象

你的 SQL 日志显示:

sql

复制

SELECT count(*) FROM "users" WHERE "users"."deleted_at" IS NULL AND ((id = $1)) LIMIT 1 OFFSET 0 [1929496158825091072] 0

你期望的是:

sql

复制

SELECT count(*) FROM "users" WHERE "users"."deleted_at" IS NULL AND id = 1929496158825091072 LIMIT 1 OFFSET 0

原因分析

这是GORM 1.x 的正常日志行为,不是 Bug:

表格

复制

日志组件行为说明
GORM 内置 Logger出于安全考虑,默认使用占位符$1而非直接拼接参数值
参数列表[1929496158825091072]显示在 SQL 语句之后,表示实际绑定的参数值

解决方案

方案一:启用完整 SQL 打印(调试用途)

go

复制

// 开启详细日志,包含完整 SQL db.LogMode(true) // 或者自定义 Logger,使用 Print SQL 模式 db.SetLogger(gorm.Logger{LogWriter: log.New(os.Stdout, "\r\n", 0)}) db.LogMode(true) // GORM 1.x 中让参数直接拼接到 SQL(不推荐生产环境使用) db.Callback().Query().Register("log", func(scope *gorm.Scope) { // 通过 scope.SQL 和 scope.Vars 手动拼接 log.Println(scope.SQL, scope.Vars) // 这里可以自行格式化输出 })

方案二:自定义 Logger 实现参数内联

go

复制

import ( "log" "os" "fmt" "github.com/jinzhu/gorm" ) // 自定义 Logger type CustomLogger struct{} func (l CustomLogger) Print(v ...interface{}) { if len(v) >= 4 { level := v[0] source := v[1] if level == "sql" { // v[3] 是 SQL 语句,v[4] 是参数数组 sql := v[3].(string) vars := v[4] // 打印带参数的完整 SQL(仅调试用途) fmt.Printf("[SQL] %s | 参数: %v | 来源: %v\n", sql, vars, source) return } } // 其他日志走默认输出 log.New(os.Stdout, "\r\n", 0).Print(v...) } // 使用自定义 Logger db.SetLogger(CustomLogger{}) db.LogMode(true)

方案三:使用第三方 GORM 日志工具

go

复制

import gormlog "github.com/op/go-logging" // 或使用 go-sql-driver/mysql 的 interpolateParams // 但这需要数据库驱动层支持

为什么使用占位符更好?

go

复制

// ❌ 不安全:SELECT ... WHERE id = 192949... // 如果参数包含恶意字符:id = "1 OR 1=1 --",会导致 SQL 注入 // ✅ 安全:使用预处理语句 // 数据库驱动会将参数与 SQL 分离处理

验证实际执行的 SQL

如果你想确认数据库实际收到的 SQL,可以在数据库层面查看:

bash

复制

# PostgreSQL SHOW log_min_duration_statement; SET log_min_duration_statement = 0; -- 记录所有语句 # MySQL SET GLOBAL general_log = 'ON'; SHOW VARIABLES LIKE 'general_log%';

总结$1占位符 + 参数列表的日志格式是 GORM 的设计特性,代表使用了预处理语句(Prepared Statement),这是安全且推荐的做法。如果你确实需要内联参数用于调试,可以使用上述方案二自定义 Logger。

http://www.jsqmd.com/news/337051/

相关文章:

  • 2026年翻堆机市场观察:聚焦牛粪处理设备的创新与选择,自动翻堆机/柴油翻堆机/苗床粉土机,翻堆机源头厂家选哪家 - 品牌推荐师
  • 盘点2026年诚信的冷液服务器企业排名看看选哪家合适 - 工业品牌热点
  • 2026年知名的氟美斯除尘布袋/工业除尘布袋厂家推荐及选择参考 - 品牌宣传支持者
  • 开源版Claude Code来了,48小时的深度使用教程
  • 2026年口碑好的高温耐磨涂层/脱硫耐磨涂层厂家推荐及选择参考 - 品牌宣传支持者
  • 2026年黑龙江口碑不错的烘焙培训机构大盘点,费用怎么收? - 工业设备
  • LangChain4j 踩坑实录:AI 工具调用流式开发,TokenStream 才是正确选择
  • 2.3
  • C++工程与CLR工程联合调试设置
  • 2026年庆阳口碑好的装修稳妥企业盘点,靠谱装修机构Top10 - 工业品牌热点
  • 北航四旋翼飞行器建模仿真实验matlab,包括 四旋翼飞行器建模 四旋翼飞行器定点悬停控制 四...
  • 总结宁波口碑好的定制化验厂考勤软件,推荐哪家验厂考勤软件公司 - 工业品网
  • 2026年口碑好的一字阻尼铰链/浴室柜阻尼铰链品牌厂家推荐 - 品牌宣传支持者
  • 深入理解快速排序算法(Java实现)
  • 聊城五星级酒店婚宴服务排名,世纪缘酒店性价比高靠谱推荐 - mypinpai
  • 2026年质量好的食品PE袋/黑色PE袋最新TOP厂家排名 - 品牌宣传支持者
  • python基于微信小程序的个人出行路线规划之地铁站点查询系统
  • 2026年比较好的Cr12MoV模具钢/Cr12模具钢厂家推荐及采购指南 - 品牌宣传支持者
  • 曹操出行进行配售:募资总额3.9亿港元
  • 真的太省时间了!AI论文工具 千笔·专业论文写作工具 VS 知文AI,自考必备!
  • 亲测好用9个降AIGC工具 千笔AI帮你轻松降AI率
  • 惊爆!72.1K star 的 Netdata:实时监控与可视化的超炫神器!
  • 为什么你的代码能力越强,反而在公司越“不存在“?
  • AI赋能网文创作:高质量小说提纲撰写实操指南
  • 北京上门回收老酒|京城亚南深耕十年,正规资质护航名酒变现 - 品牌排行榜单
  • 诚信的GEO服务专业公司靠谱吗,珠海口碑好的有哪些? - 工业设备
  • 表头标题表头
  • 2026年兰州可靠的装修机构年度排名,看看哪家值得选 - 工业品牌热点
  • 假新闻检测数据集_44898条新闻文本数据用于机器学习与自然语言处理研究-训练和评估假新闻检测模型,开发自然语言处理算法,以及构建智能内容审核系统-理解虚假信息的语言特征、传播模式和识别方法
  • MATLAB代码:基于MATLAB的三母线高斯赛德尔潮流分析计算 关键词:潮流计算 电力系统 ...