如何使用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
相关产品推荐
相关产品推荐

