You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用go-sqlmock在Golang中Mock SQL的max()函数?

解决SQLMock匹配带MAX()函数的查询问题

你的问题主要出在两个地方,修正后即可正常Mock:

  • Mock期望SQL存在笔误:你写的Mock语句里多了个无关的co(public.abc co where),但实际执行的SQL是public.abc where,直接导致正则匹配失败。
  • 结果集列名可能不匹配:使用MAX(a)函数时,多数数据库返回的列名默认是max或max(a),而非原始列名a,如果测试代码里用a作为结果集列名,后续读取结果时可能出错。

修正后的Mock代码

maxOfA := 1
// 根据数据库返回的列名调整,比如PostgreSQL默认返回列名为"max"
maxOfARows := sqlmock.NewRows([]string{"max"}).AddRow(maxOfA)
// 去掉多余的"co",保留正确的SQL结构,用对应数据库的占位符(这里是PostgreSQL的$1)
suite.mock.ExpectQuery(`select max(a) from public.abc where id = \$1`).WithArgs(1).WillReturnRows(maxOfARows)

带列别名的情况

如果你的实际SQL给MAX()加了别名(比如select max(a) as max_a from ...),结果集列名要对应修改:

maxOfA := 1
maxOfARows := sqlmock.NewRows([]string{"max_a"}).AddRow(maxOfA)
suite.mock.ExpectQuery(`select max(a) as max_a from public.abc where id = \$1`).WithArgs(1).WillReturnRows(maxOfARows)

额外提示

  • 若使用MySQL等用?作为占位符的数据库,需把\$1替换为\?。
  • 若要忽略SQL的空格、大小写差异,可使用正则严格匹配:
    suite.mock.ExpectQuery(`^select max\(a\) from public\.abc where id = \$1$`).WithArgs(1).WillReturnRows(maxOfARows)
    
    用^和$限定语句首尾,用\(和\)转义括号,避免正则解析错误。

内容的提问来源于stack exchange,提问作者EarthsPiligrim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:50:21