J'utilise Gorm v1. Ma plage de pagination fonctionne bien :
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) } }
Et comment on m'appelle :
if err := gs.db.Scopes(entities.Paginate(genre, p)).Find(&gs.Genres).Error; err != nil { return errors.New(err.Error()) }
Encore une fois, cela fonctionnait bien jusqu'à ce que je passe à Gorm v2. Maintenant, je reçois le message suivant :
[0,204 ms] [lignes : 2] SELECT * FROM
genres
LIMITE 2 sql : 9 paramètres cibles attendus dans l'analyse, pas 1 ; sql : 9 paramètres cibles attendus dans l'analyse, au lieu de 1 [GIN] 2022/06/18 - 00:41:00 | 1.5205 ms | 127.0 .0.1 | /api/v1/genre" Erreur n°01 : sql : analyse attendue de 9 paramètres cibles au lieu de 1 ; sql : analyse attendue de 9 paramètres cibles au lieu de 1
Maintenant, j'ai découvert que l'erreur est causée par cette ligne :
db.Model(实体).Count(&totalRows)
Parce que si je le supprime, alors ma requête s'exécute correctement (apparemment, la connexion de TotalPages
的数据不正确,因为它没有计算)。浏览文档,我看到https://gorm.io/docs/method_chaining.html#Multiple-Immediate-Methods,所以我的猜测是用于获取 totalRows
est réutilisée et contient des données résiduelles, donc mes requêtes de décalage et de limite échouent.
J'ai essayé de créer une nouvelle session pour les requêtes de comptage et de décalage :
db.Model(entity).Count(&totalRows).Session(&gorm.Session{})
return db.Offset(p.Offset).Limit(p.PerPage).Session(&gorm.Session{})
J'aimerais que chacun puisse utiliser sa propre session, mais cela ne semble pas fonctionner.
Des suggestions ?
Si quelqu'un en a besoin :
J'ai dû créer une nouvelle session, mais je ne l'ai pas créée de la bonne manière. Ce que j'ai fini par faire :
L'effet est comme prévu. Ma gamme actuelle est donc :
Veuillez noter que j'utilise une nouvelle session via
countDBSession
获取计数,这不会影响*db.Gorm
参数在return db.Offset(p.Offset).Limit(p.PerPage) 的使用).Session(&gorm.Session{})