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

Golang使用sqlmock时无法扫描uuid.UUID至UUID类型的问题

解决sqlmock扫描uuid.UUID类型报错的问题

问题原因

你遇到的扫描错误,本质是sqlmock返回的UUID值类型不符合数据库驱动的扫描预期。虽然你的Item结构体中Code是uuid.UUID类型,但数据库实际存储UUID时是以字符串(或特定二进制格式)存储的,而sqlmock的AddRow方法直接传入uuid.UUID实例时,不会自动将其转换为数据库能识别的字符串格式,导致GORM在扫描时无法正确解析。

解决方案

修改测试代码中WillReturnRows的AddRow参数,将uuid.UUID实例转换为字符串形式:

func (s *Suite) Test_delete() {
    var (
        id       = uuid.New()
        name     = "test"
        quantity = 2
    )
    s.mock.ExpectQuery(regexp.QuoteMeta(
        `SELECT * FROM "items" WHERE code = $1 AND "items"."deleted_at" IS NULL`,
    )).
        WithArgs(id). // 保持uuid.UUID类型,匹配GORM传入的参数类型
        WillReturnRows(sqlmock.NewRows([]string{"code", "name", "quantity"}).
            AddRow(id.String(), name, quantity)) // 将id转为字符串格式

    err := s.repository.DeleteItem(id.String())
    require.NoError(s.T(), err)
}

额外注意点

  • 确保项目中所有用到的UUID都来自同一个包(比如github.com/google/uuid),避免不同UUID包类型不兼容导致隐性错误。
  • 如果你的数据库(如PostgreSQL)原生支持UUID类型,GORM会自动处理uuid.UUID与数据库类型的转换,但sqlmock需要手动模拟数据库返回的实际数据格式(字符串)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 08:25:47