Skop Golang Gorm rosak selepas menaik taraf daripada v1 kepada v2
P粉005417748
P粉005417748 2024-02-03 17:53:53
0
1
552

Saya menggunakan Gorm v1. Julat penomboran saya berfungsi dengan baik:

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

Dan bagaimana saya dipanggil:

if err := gs.db.Scopes(entities.Paginate(genre, p)).Find(&gs.Genres).Error; err != nil {
        return errors.New(err.Error())
    }

Sekali lagi, ini berfungsi dengan baik sehingga saya menaik taraf kepada Gorm v2. Sekarang saya mendapat mesej berikut:

[0.204ms] [baris: 2] PILIH * DARI genres HAD 2 sql: Jangkaan 9 parameter sasaran dalam imbasan, bukan 1 sql: Jangkaan 9 parameter sasaran dalam imbasan, bukannya 1 [GIN] 2022/06/18 - 00:41:00 |. /api/v1/genre" Ralat #01: sql: Imbas 9 parameter sasaran yang dijangka dan bukannya 1 sql: Imbas 9 parameter sasaran yang dijangka dan bukannya 1

Sekarang, saya mendapati bahawa ralat disebabkan oleh baris ini: db.Model(实体).Count(&totalRows) Kerana jika saya mengalih keluarnya, maka pertanyaan saya dilaksanakan dengan betul (nampaknya sambungan TotalPages 的数据不正确,因为它没有计算)。浏览文档,我看到https://gorm.io/docs/method_chaining.html#Multiple-Immediate-Methods,所以我的猜测是用于获取 totalRows sedang digunakan semula dan mempunyai beberapa baki data, jadi pertanyaan offset dan had saya gagal. Saya cuba membuat sesi baharu untuk pertanyaan kiraan dan mengimbangi: db.Model(entity).Count(&totalRows).Session(&gorm.Session{})

return db.Offset(p.Offset).Limit(p.PerPage).Session(&gorm.Session{})

Berharap semua orang boleh menggunakan sesi mereka sendiri, tetapi ia nampaknya tidak berkesan.

Ada cadangan?

P粉005417748
P粉005417748

membalas semua(1)
P粉465287592

Jika ada yang memerlukannya:

Saya memang perlu mencipta sesi baharu, tetapi saya tidak menciptanya dengan cara yang betul. Perkara yang akhirnya saya lakukan:

countDBSession := db.Session(&gorm.Session{Initialized: true})
countDBSession.Model(entity).Count(&totalRows)

Kesannya seperti yang dijangkakan. Jadi julat semasa saya ialah:

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

Sila ambil perhatian bahawa saya menggunakan sesi baharu melalui countDBSession 获取计数,这不会影响 *db.Gorm 参数在 return db.Offset(p.Offset).Limit(p.PerPage) 的使用).Session(&gorm.Session{})

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan