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
相关产品推荐
相关产品推荐

