Heim > Backend-Entwicklung > Golang > Gorm unterschiedliche Spaltenreihenfolge und Testfehler

Gorm unterschiedliche Spaltenreihenfolge und Testfehler

王林
Freigeben: 2024-02-10 15:20:10
nach vorne
448 Leute haben es durchsucht

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

PHP-Redakteur Dies liegt daran, dass Gorm beim Durchführen einer Abfrage SQL-Anweisungen basierend auf der Reihenfolge der Felder in der Struktur generiert. Wenn wir in der Abfrage eine bestimmte Spaltenreihenfolge angeben, die Feldreihenfolge in der Struktur jedoch nicht damit übereinstimmt, schlägt der Test fehl. Daher müssen wir bei der Verwendung von Gorm für Datenbankabfragen darauf achten, dass die Reihenfolge der Felder in der Struktur mit der Reihenfolge der Spalten in der Abfrage übereinstimmt, um dieses Problem zu vermeiden.

Frageninhalt

In meinem Code habe ich das folgende Modell:

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"`
}
Nach dem Login kopieren

Ich verwende die gorm.DB 结构的 CreateInBatches-Methode.

Ich verwende go-sqlmock für Unit-Tests. In diesem Modell werden nur Einfügevorgänge ausgeführt.

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))))
}
Nach dem Login kopieren

Meine Testfälle schlagen manchmal aufgrund der unterschiedlichen Reihenfolge von create_dateupdate_date fehl.

Einer der Fehler ist

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 \(\?,\?,\?,\?,\?\)"
Nach dem Login kopieren

Für meinen Anwendungsfall spielt die Reihenfolge der Spalten in der Einfügung keine Rolle. Wie kann ich damit in Unit-Tests umgehen, um alle Szenarien zu bewältigen?

Workaround

Nachdem ich die SQLMock-Dokumentation hier gelesen hatte, bekam ich den folgenden Workaround:

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))))
}
Nach dem Login kopieren

Ich habe die Spalten und Werte gelöscht. In meinem Fall muss ich mich nicht um das Feld create_dateupdate_date kümmern, also funktioniert es einwandfrei.

Das obige ist der detaillierte Inhalt vonGorm unterschiedliche Spaltenreihenfolge und Testfehler. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage