首頁 > 後端開發 > Golang > Gorm 不同的列順序和測試失敗

Gorm 不同的列順序和測試失敗

王林
發布: 2024-02-10 15:20:10
轉載
444 人瀏覽過

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 不同的列順序和測試失敗的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板