Heim > Fragen und Antworten > Hauptteil
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粉4652875922024-02-04 17:11:07
如果有人需要它:
我确实必须创建一个新会话,但我没有以正确的方式创建它。我最终做了:
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{})