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?
如果有人需要它:
我确实必须创建一个新会话,但我没有以正确的方式创建它。我最终做了:
效果正如预期的那样。所以我现在的范围是:
请注意,我正在使用新会话通过
countDBSession
获取计数,这不会影响*db.Gorm
参数在return db.Offset(p.Offset).Limit(p.PerPage) 的使用).Session(&gorm.Session{})