Maison > Questions et réponses > le corps du texte
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 ?
P粉4652875922024-02-04 17:11:07
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 :
countDBSession := db.Session(&gorm.Session{Initialized: true}) countDBSession.Model(entity).Count(&totalRows)
L'effet est comme prévu. Ma gamme actuelle est donc :
// 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) } }
Veuillez noter que j'utilise une nouvelle session via countDBSession
获取计数,这不会影响 *db.Gorm
参数在 return db.Offset(p.Offset).Limit(p.PerPage) 的使用).Session(&gorm.Session{})