La portée de Golang Gorm est cassée après la mise à niveau de la v1 vers la v2
P粉005417748
P粉005417748 2024-02-03 17:53:53
0
1
493

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粉005417748
P粉005417748

répondre à tous(1)
P粉465287592

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{})

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal