首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用go-sqlmock模拟gorm `updates`时出现` not not match实际sql`错误?

在使用go-sqlmock模拟gorm的updates方法时出现not not match实际sql错误的原因是模拟的SQL语句与实际执行的SQL语句不匹配。

解决这个问题的方法是确保模拟的SQL语句与实际执行的SQL语句一致。可以通过以下步骤来排查和解决问题:

  1. 检查模拟的SQL语句是否与实际执行的SQL语句一致。比较两者的语法、参数、表名等是否完全匹配。如果不匹配,可以尝试修改模拟的SQL语句,使其与实际执行的SQL语句一致。
  2. 确保使用go-sqlmock的正确方法。在模拟gorm的updates方法时,需要使用ExpectExec方法来模拟执行SQL语句。确保使用了正确的方法和参数。
  3. 检查gorm的配置是否正确。确保gorm的配置与模拟的SQL语句相匹配。比如,检查数据库连接配置、表名、字段名等是否正确。
  4. 检查模拟的SQL语句是否正确执行。可以通过打印模拟的SQL语句和实际执行的SQL语句来比较,查看是否有差异。如果有差异,可以进一步排查问题。
  5. 如果以上方法都无法解决问题,可以尝试查阅go-sqlmock的文档或者在相关的开发社区中寻求帮助。可能有其他开发者遇到过类似的问题并给出了解决方案。

在腾讯云的产品中,推荐使用云数据库 TencentDB 来进行数据库的管理和维护。TencentDB 提供了高可用、高性能、安全可靠的数据库服务,支持主流数据库引擎,如 MySQL、SQL Server、PostgreSQL 等。您可以通过腾讯云官网了解更多关于 TencentDB 的信息和产品介绍:TencentDB产品介绍

请注意,以上答案仅供参考,具体解决方法可能因实际情况而异。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

在项目里怎么给 GORM 做单元测试

在很多使用ORM工具的场景下,也可以使用go-sqlmock库 Mock数据库操作进行测试,今天这篇内容我就以 GORM 为例,讲解怎么给项目中的 ORM 数据库操作做单元测试。..., userId).Updates(updated).Error return } 接下来我们就用 go-sqlmock 工具给这几个 DAO 函数做一下 Mock 测试。...让sqlmock 使用 QueryMatcherEqual 匹配器,该匹配器把mock.ExpectQuery 和 mock.ExpectExec 的参数作为预期要执行的SQL语句跟实际要执行的SQL进行相等比较...这个SQL怎么获取呢?其实我们先随便写一个SQL,执行一次测试,在报错信息里就会告知CreateUser操作在写表 GORM 真正要执行的 SQL 啦。...目前没有办法 Mock 测试 GORM 的UPDATE,除非用 GORM 的 Exec 方法直接执行要更新的SQL,不过那就失去使用ORM的意义了,所以这个先跳过,如果有这方面经验的大佬,可以在留言里指导一下

1.7K20

上次的问题解决啦,重新送上Go ORM 单元测试全流程讲解

从上次发文说起 在上次发布的文章《在项目里怎么给 GORM 做单元测试》中对 ORM 的 Update 操作的测试中,因为 ORM 库每次做更新操作,都会针对updated_at字段进行自动更新,导致我们在写...在很多使用ORM工具的场景下,也可以使用go-sqlmock库 Mock数据库操作进行测试,今天这篇内容我就以 GORM 为例,讲解怎么给项目中的 ORM 数据库操作做单元测试。..., userId).Updates(updated).Error return } 接下来我们就用 go-sqlmock 工具给这几个 DAO 函数做一下 Mock 测试。...让sqlmock 使用 QueryMatcherEqual 匹配器,该匹配器把mock.ExpectQuery 和 mock.ExpectExec 的参数作为预期要执行的SQL语句跟实际要执行的SQL进行相等比较...其实我们先随便写一个SQL,执行一次测试,在报错信息里就会告知CreateUser操作在写表 GORM 真正要执行的 SQL 啦, 也可以通过GORM提供的Debug()方法获取到。

78340

Go 单元测试之Mysql数据库集成测试

它可以模拟 SQL 查询、插入、更新等操作,并且可以验证 SQL 语句的执行情况,非常适合用于单元测试中。...二、安装 go get github.com/DATA-DOG/go-sqlmock 三、基本用法 使用 sqlmock 进行 MySQL 数据库集成测试的基本步骤如下: 创建模拟 DB 连接: import...mock 来替代真实的数据库连接 // db 可以传递给被测试的函数进行测试 } 设置模拟 SQL 查询和预期结果: // 模拟 SQL 查询并设置预期结果 rows := sqlmock.NewRows...然后,使用 gorm.DB 的 Create 方法将用户信息插入到数据库中。如果插入操作遇到唯一性约束错误(例如邮箱或手机号已存在),方法会返回一个特定的错误 ErrUserDuplicate。...提供了一个使用 GORM 进行数据库操作的 DAO 层,用于处理用户数据的创建。

7410

基于sqlmock模拟数据库驱动编写Golang单元测试用例

2. sqlmock 简介在使用gorm等orm框架,由于需要和数据库进行交互,并且CICD服务器在对代码检测的时候,往往也无法连接真正的数据库,因此编写单元测试,就会变得很困难。...go-sqlmock 本质是一个实现了 sql/driver 接口的 mock 库,它的设计目标是支持在测试中,模拟任何 sql driver 的行为,而不需要一个真正的数据库连接。...安装 go-sqlmockgo get github.com/DATA-DOG/go-sqlmock4. sqlmock实战首先我们模拟一下,在实际开发中会使用gorm来对数据库查询操作。.../driver/mysql" "gorm.io/gorm" "github.com/DATA-DOG/go-sqlmock")// 初始化sqlmockfunc initTest() (*gorm.DB.../driver/mysql" "gorm.io/gorm" "github.com/DATA-DOG/go-sqlmock")func initTest() (*gorm.DB, sqlmock.Sqlmock

30810

Gorm实战,轻松掌握数据库增删改查技巧!

`deleted_at` IS NULL AND ` = 1 4.2 更新单个列 当使用 Update 更新单个列,你需要指定条件,否则会返回 ErrMissingWhereClause 错误,查看...,并返回 ErrMissingWhereClause 错误 对此,你必须加一些条件,或者使用原生 SQL,或者启用 AllowGlobalUpdate 模式,例如: db.Model(&User{})....result.Error) // 错误 五、Update高级选项(了解) 5.1 使用 SQL 表达式更新 GORM 允许使用 SQL 表达式更新列,例如: // user 的 ID 是 `1` db.First...Hook 和时间追踪 如果您想在更新跳过 Hook 方法且不追踪更新时间,可以使用 UpdateColumn、UpdateColumns,其用法类似于 Update、Updates // 更新单个列..., "%灰太狼%") 阻止全局删除 如果在没有任何条件的情况下执行批量删除,GORM 不会执行该操作,并返回 ErrMissingWhereClause错误 对此,你必须加一些条件,或者使用原生 SQL

2.2K20

一文说尽Golang单元测试实战的那些事儿

不过上面生成的函数没有校验返回的错误内容,如有需要可以自己稍微修改一下。 三、解决常见的依赖等问题 解决常见的依赖等问题目前有两种思路: 通过mock方式替换实际依赖,并通过打桩操作其返回内容。...通过本地启动一个模拟依赖环境,比如模拟redis服务等,然后直接访问模拟服务。...看到mock字眼大家大概也知道它是怎么使用的了,也是通过对执行sql语句打桩来完成测试。...*sql.DB,而是用到一些第三方 ORM 框架,那么需要想办法让这些框架使用我们的 mock db,比如对于 gorm 框架,可以这么配置: sqlDB, dbMock, err := sqlmock.New...&gorm.Config{}) 谈到gorm框架,那么问题来了,如果我不直接操作*sql.DB而是用的框架,但我不知道最后生成的sql是什么那该怎么办?

1.1K40

GORM V2 写操作

默认值 可以使用 GORM 标签 default 设置默认值,插入数据,设置的默认值会被用于填充值为零值的字段。 需要注意的是,如果默认值本身是数据类型的零值,将不会被保存到数据库。...Update 方法更新单个列,需要指定条件,否则会返回 ErrMissingWhereClause 的错误。..., 19).Update("age", 21) 当使用 Model 方法,并且该对象的主键有值,该值会被用于更新条件。...{} 参数,需要注意的是,当使用 struct 作为参数GORM 只会更新字段的值不是字段类型的零值的字段。...如果希望执行全局更新,需要指定条件,或使用原生 SQL,或启用 AllowGlobalUpdate 模式。 更新的记录数和更新操作的错误 获取受影响的行数和更新操作的错误

2.7K10

Gorm 实践指南

事务模板 // 开始事务 tx := db.Begin() // 在事务中做一些数据库操作(从这一点使用'tx',而不是'db') tx.Create(...) // ... // 发生错误时回滚事务...执行性能, GORM 支持自动的 Prepared Statement 缓冲,启用后,由 Gorm 生成的 SQL 或者 RAW SQL 都会进行预处理并缓存,Prepare Statement 可与数据库事务协同工作...results { // 批量处理数据 } // 批量更新数据,在使用 Save 处理批量数据,会使用 Insert OnConflict DoNothing 模式...='hello', age=18 WHERE id IN (10, 11); 更新选定字段 如果您想要在更新选定、忽略某些字段,您可以使用 Select、Omit // 使用 Map 进行 Select...在更新数据,如果使用了 struct 来更新数据,默认只会更新非零值字段,如果使用map更新数据,则会更新全部字段,在使用 struct 更新,也可以使用 Select 方法来选择想要更新的字段,

2.1K20

从零开发区块链应用(三)--mysql初始化及gorm框架使用

} 二、gorm 框架使用 Gorm 是 golang 的一个 orm 框架,它提供了对数据库操作的封装,使用起来相当便利。...所以如果对 mysql 使用操作不熟悉,建议也可以使用 gorm 框架操作 mysql 数据库。...(logger.Silent), //打印详细日志,可在代码测试关闭,打开后为静默输出 }) 连接比较简单,直接调用 gorm.Open 传入数据库地址即可。...配置文件管理工具 viper[2] 从零开发区块链应用(二)--mysql 安装及数据库表的安装创建[3] 从零开发区块链应用(三)--mysql 初始化及 gorm 框架使用[4] 从零开发区块链应用...框架使用: https://learnblockchain.cn/article/3448 [5] 从零开发区块链应用(四)--自定义业务错误信息: https://learnblockchain.cn

94010

Go语言微服务框架 - 4.初识GORM

,我推荐的使用方式有2个特点: 尽可能简单,不要出现魔法变量,比如常量字符串 不要让框架强约束表结构的设计,也是为了后续迁移框架、甚至语言成本更低 查询 中文文档链接 - https://gorm.io...其中,希望大家能重点看一下默认值问题: 我们固然可以通过在定义字段,排除这些默认值的情况,如定义int类型字段跳过0、从1开始。...但在实际的项目中,定义往往很难控制,我们不得不做一定的妥协,这部分hard code的成本也是可以接受的。 我们不能因为框架里的一些特性,过度地限制其余组件的使用。...db.Delete(&email) 3.使用GORM的思考 GORM是一个非常重量级的工具,尤其是*gorm.DB提供了大量的类似于Builder模式的方法,用来拼接SQL。...整个使用过程,对于一个不熟悉SQL语言的同学来说是很痛苦的,需要大量调试问题的时间;而对于熟悉SQL的朋友也会很疑惑,例如First等这种自定义命名的底层实现。

1.5K20

GORM CRUD 5 分钟快速上手

使用 ORM 组件,可以让开发者通过操作对象的方式完成对数据库的操作(读写),避免手动书写 SQL 和完成数据到对象的转换,让我们更方便的操作数据库。...理论上 ORM 可以让我们脱离 SQL,但实际上还是需要懂 SQL 才能更好地使用 ORM。 2.GORM 是什么 GORM 是一个流行的 Golang ORM 库。...Map Find/Create,使用 SQL 表达式、Context Valuer 进行 CRUD SQL 构建器,Upsert,锁,Optimizer/Index/Comment Hint,命名参数...go get -u gorm.io/driver/postgres go get -u gorm.io/driver/sqlserver 驱动包按照自己实际使用的 DB 选择即可。...Updates 方法支持 struct 和 map[string]interface{} 参数。当使用 struct 更新,默认情况下,GORM 只会更新非零值的字段。

1.7K20

一文学会 Go 的三个主流开发框架| 青训营笔记

如果您遵循 GORM 的约定,您就可以少写的配置、代码。 如果约定不符合您的实际要求,GORM 允许你配置它们。...First 方法返回符合指定条件的首个记录值;值得注意的是,使用 First 方法进行查询,如果查找不到数据会返回 ErrRecodeNotFound 错误。...可以使用 Find 查询多条记录,而 Find 方法在查询不到数据的时候并不会返回错误。...假设有一个电商网站数据库,涉及创建订单和配置库存两个操作,如果创建订单完成后配置库存失败了,那么理论上创建订单也应该被自动回滚以避免数据不一致,通过事务系统,我们可以将这两个操作划入一个事务,这样,当其中一个操作出现错误...如果您已经为模型定义了指定的方法,它会在创建、更新、查询、删除自动被调用。如果任何回调返回错误GORM 将停止后续的操作并回滚事务。

2.5K10

golang源码分析:gorm

但结构体为零值 sql 不执行 gorm.io 版本必须传两个参数,传结构体用Updates 4,where条件不一致 jinzhu版在调用 Where 时会创建一个副本,同一个 DB 在多行调用 Where...conditions, order by primary key gorm使用builder模式将SQL各种表达通过实现Build方法来生成对应字符串。...github.com/jinzhu/gorm/main.go // First find first record that match given conditions, order by primary...: 1,reflect导致的底层的性能不高(这点还能接受) 2,interface{}如果传入了不支持的复杂数据类型,排查问题麻烦,往往要运行程序时才会报错 3,高频拼接重复SQL - 在一个程序运行过程中...,执行的SQL语句都比较固定,而变化的往往是参数;从GORM的实现来看,每次执行都需要重新拼接一次SQL语句,是有不小的优化空间的,比如引入一定的cache。

2.3K20

「Go开源包」nunu:一个快速构建应用程序的脚手架

功能 nunu是基于以下流行的开源库组建而成的: Gin: https://github.com/gin-gonic/gin Gorm: https://github.com/go-gorm/gorm...: https://github.com/DATA-DOG/go-sqlmock Gomock: https://github.com/golang/mock 简洁的分层架构 Nunu采用了经典的分层架构...Golang项目: nunu new projectName 该命令实际上是从github的默认地址上拉取的模版。...当然也可以使用国内加速的仓库作为模版: // 使用基础模板 nunu new projectName -r https://gitee.com/go-nunu/nunu-layout-basic.git...mocks:该模块包含了各个模块的接口的模拟实现,用于单元测试。 pkg:该模块包含了一些通用的功能和工具。 scripts:该模块包含了一些脚本文件,用于项目的构建、测试和部署等操作。

64240

GORM V2 几个最实用的功能和升级注意事项

使用GORM的时候,如果我们想把GORM产生的日志记录到项目统一的应用日志中的,需要自己去实现GORM提供的logger 接口。...一般都不推荐引入GLS,实际上性能影响不明显,之前有些服务请求量最大2000QPS的时候也没出现过瓶颈。...Error 使用Find查询数据的时候,在V1版本里如果查不到数据会返回错误,所以很多人在代码里的下面这行判断会失效 if err !...= gorm.ErrRecordNotFound 但是使用 First、Last、Take 这些预期会返回结果的方法查询记录,还会返回 ErrRecordNotFound。...Name string IsDel soft_delete.DeletedAt `gorm:"softDelete:flag"` } 那么这样GORM在执行SQL语句就会自动带上is_del这个字段进行查询啦

1800

Go项目重构经验分享——ORM框架实践

,model1. model层model包下的代码原为数据库表映射的结构体,这部分手工生成既麻烦也容易出现错误,可以直接通过gorm提供的GEN 工具进行生成通过 go get 引入库代码,调用库提供的脚本即可方便地生成...的 tag 设置,在实际应用中有几点踩坑经历:一是 gorm 对于 default 值的处理方式,如上面代码所示,Env 字段设置了默认值 dev,当调用插入接口,如该值为空则会填写默认值,但这种情况只适用于所有数据库的默认值设置都相同的情况...如果想要在插入数据使用数据库设置的默认值,需得在 tag 中设置 default:(-) ,如上述 SType字段,否则 gorm 会在插入时为其设置默认的零值(更加具体的解释可参考这篇文章 )二是...= nil { // 处理错误}这一点本身并不迷惑,但在查询数据库中的对应记录,如果使用 First 、 Take 、 Last 方法从数据库中检索单个对象,当没有找到记录,它会返回 ErrRecordNotFound...错误;但如果使用 Find 方法查询多条数据,如果没有命中纪录,其并不会返回 ErrRecordNotFound 错误,而这一点与老项目中数据库的处理逻辑是不兼容的,因此需要特别注意更新0值/非0

47330
领券