Das Golang Gorm-Zielfernrohr ist nach dem Upgrade von Version 1 auf Version 2 defekt
P粉005417748
P粉005417748 2024-02-03 17:53:53
0
1
496

Ich verwende Gorm v1. Mein Paginierungsbereich funktioniert einwandfrei:

func Paginate(entity BaseEntity, p *Pagination) func(db *gorm.DB) *gorm.DB {
    return func(db *gorm.DB) *gorm.DB {
        var totalRows int64

        db.Model(entity).Count(&totalRows)
        
        totalPages := int(math.Ceil(float64(totalRows) / float64(p.PerPage)))
        p.TotalPages = totalPages
        p.TotalCount = int(totalRows)
        p.SetLinks(entity.ResourceName())

        return db.Offset(p.Offset).Limit(p.PerPage)
    }
}

Und wie ich heiße:

if err := gs.db.Scopes(entities.Paginate(genre, p)).Find(&gs.Genres).Error; err != nil {
        return errors.New(err.Error())
    }

Auch das funktionierte einwandfrei, bis ich ein Upgrade auf Gorm v2 durchgeführt habe. Nun erhalte ich folgende Meldung:

[0,204 ms] [Zeilen: 2] SELECT * FROM genres LIMIT 2 sql: 9 Zielparameter im Scan erwartet, nicht 1; /api/v1/genre" Fehler Nr. 01: SQL: Erwartete 9 Zielparameter scannen statt 1; SQL: Erwartete 9 Zielparameter scannen statt 1

Jetzt habe ich herausgefunden, dass der Fehler durch diese Zeile verursacht wird: db.Model(实体).Count(&totalRows) Denn wenn ich es entferne, wird meine Abfrage korrekt ausgeführt (anscheinend wird die Verbindung von TotalPages 的数据不正确,因为它没有计算)。浏览文档,我看到https://gorm.io/docs/method_chaining.html#Multiple-Immediate-Methods,所以我的猜测是用于获取 totalRows wiederverwendet und enthält einige Restdaten, sodass meine Offset- und Limit-Abfragen fehlschlagen. Ich habe versucht, eine neue Sitzung für Zähl- und Offset-Abfragen zu erstellen: db.Model(entity).Count(&totalRows).Session(&gorm.Session{})

return db.Offset(p.Offset).Limit(p.PerPage).Session(&gorm.Session{})

Ich wünschte, jeder könnte seine eigene Sitzung nutzen, aber es scheint nicht zu funktionieren.

Irgendwelche Vorschläge?

P粉005417748
P粉005417748

Antworte allen(1)
P粉465287592

如果有人需要它:

我确实必须创建一个新会话,但我没有以正确的方式创建它。我最终做了:

countDBSession := db.Session(&gorm.Session{Initialized: true})
countDBSession.Model(entity).Count(&totalRows)

效果正如预期的那样。所以我现在的范围是:

// Paginate is a Gorm scope function.
func Paginate(entity BaseEntity, p *Pagination) func(db *gorm.DB) *gorm.DB {
    return func(db *gorm.DB) *gorm.DB {

        var totalRows int64

        // we must create a new session to run the count, otherwise by using the same db connection
        // we'll get some residual data which will cause db.Offset(p.Offset).Limit(p.PerPage) to fail.
        countDBSession := db.Session(&gorm.Session{Initialized: true})
        countDBSession.Model(entity).Count(&totalRows)

        totalPages := int(math.Ceil(float64(totalRows) / float64(p.PerPage)))
        p.TotalPages = totalPages
        p.TotalCount = int(totalRows)
        p.SetLinks(entity.ResourceName())

        return db.Offset(p.Offset).Limit(p.PerPage)
    }
}

请注意,我正在使用新会话通过 countDBSession 获取计数,这不会影响 *db.Gorm 参数在 return db.Offset(p.Offset).Limit(p.PerPage) 的使用).Session(&gorm.Session{})

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage