Maison > développement back-end > Golang > le corps du texte

Gorm ordre des colonnes différent et échec du test

王林
Libérer: 2024-02-10 15:20:10
avant
412 Les gens l'ont consulté

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

L'éditeur PHP Xinyi est là pour vous présenter un problème concernant Gorm : lorsque nous utilisons Gorm pour effectuer des requêtes de base de données, des ordres de colonnes différents peuvent provoquer un échec des tests. En effet, lorsque Gorm effectue une requête, il génère des instructions SQL basées sur l'ordre des champs dans la structure. Si nous spécifions un ordre de colonnes spécifique dans la requête, mais que l'ordre des champs dans la structure ne correspond pas, le test échouera. Par conséquent, lorsque nous utilisons Gorm pour des requêtes de base de données, nous devons faire attention à ce que l'ordre des champs dans la structure soit cohérent avec l'ordre des colonnes dans la requête pour éviter ce problème.

Contenu de la question

Dans mon code j'ai le modèle suivant :

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"`
}
Copier après la connexion

J'utilise la méthode gorm.DB 结构的 CreateInBatches.

J'utilise go-sqlmock pour les tests unitaires. Dans ce modèle, seules les opérations d'insertion sont effectuées.

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))))
}
Copier après la connexion

Mes cas de test échouent parfois en raison de l'ordre différent de create_dateupdate_date .

L'un des échecs est

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 \(\?,\?,\?,\?,\?\)"
Copier après la connexion

Pour mon cas d'utilisation, l'ordre des colonnes dans l'insert n'a pas d'importance. Comment puis-je gérer cela dans les tests unitaires pour gérer tous les scénarios ?

Solution de contournement

Après avoir lu la documentation sqlmock ici J'ai obtenu la solution de contournement suivante :

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))))
}
Copier après la connexion

J'ai supprimé les colonnes et les valeurs. Dans mon cas, je n'ai pas besoin de me soucier du champ create_dateupdate_date, donc ça fonctionne très bien.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!