Gorm 不同的列顺序和测试失败

2024年 2月 10日 63.7k 0

gorm 不同的列顺序和测试失败

php小编新一在这里为大家介绍一个有关Gorm的问题:当我们在使用Gorm进行数据库查询时,不同的列顺序可能会导致测试失败的问题。这是因为Gorm在进行查询时,会根据结构体中字段的顺序来生成SQL语句。如果我们在查询中指定了特定的列顺序,但结构体中的字段顺序与之不匹配,就会导致测试失败。因此,在使用Gorm进行数据库查询时,我们需要注意结构体中字段的顺序与查询中列的顺序保持一致,以避免这个问题的发生。

问题内容

在我的代码中,我有以下模型:

type ID uint64

type BaseModel struct {
ID ID `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
UpdateDate time.Time `gorm:"column:update_date;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"update_date"`
CreateDate time.Time `gorm:"column:create_date;default:CURRENT_TIMESTAMP" json:"create_date"`
}

type Rollback struct {
BaseModel
PID ID `gorm:"index"`
Table string `gorm:"column:tbl_name"`
RollbackRow string `gorm:"type:longtext"`
}

登录后复制

我正在使用 gorm.DB 结构的 CreateInBatches 方法。

我使用 go-sqlmock 进行单元测试。在该模型中,仅执行插入操作。

func expectRollbackInsert(mock sqlmock.Sqlmock, tablename []string) {
args := make([]driver.Value, 0)
for _, val := range tablename {
args = append(args, 1, val, sqlmock.AnyArg(), sqlmock.AnyArg(), sqlmock.AnyArg())
}
mock.ExpectExec(regexp.QuoteMeta("INSERT INTO `rollback` (`payment_id`,`tbl_name`,`rollback_row`,`update_date`,`create_date`) VALUES (?,?,?,?,?)")).
WithArgs(args...).
WillReturnResult(sqlmock.NewResult(int64(len(tablename)), int64(len(tablename))))
}

登录后复制

由于 create_dateupdate_date 的顺序不同,我的测试用例有时会失败。

其中一个失败是

ExecQuery: could not match actual sql: "INSERT INTO `rollback` (`pid`,`tbl_name`,`rollback_row`,`create_date`,`update_date`) VALUES (?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?),(?,?,?,?,?)" with expected regexp "INSERT INTO `rollback` (`pid`,`tbl_name`,`rollback_row`,`update_date`,`create_date`) VALUES (?,?,?,?,?)"

登录后复制

对于我的用例,插入中列的顺序并不重要。我如何在单元测试中处理它来处理所有场景?

解决方法

阅读 sqlmock 文档此处后,我得到了以下解决方法:

func expectRollbackInsert(mock sqlmock.Sqlmock, tablename []string) {
args := make([]driver.Value, 0)
for _, val := range tablename {
args = append(args, 1, val, sqlmock.AnyArg(), sqlmock.AnyArg(), sqlmock.AnyArg())
}
mock.ExpectExec(regexp.QuoteMeta("INSERT INTO `rollback`")).
WithArgs(args...).
WillReturnResult(sqlmock.NewResult(int64(len(tablename)), int64(len(tablename))))
}

登录后复制

我删除了列和值。就我而言,我不需要关心 create_dateupdate_date 字段,因此它工作得很好。

以上就是Gorm 不同的列顺序和测试失败的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论