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?
Jika ada yang memerlukannya:
Saya memang perlu mencipta sesi baharu, tetapi saya tidak menciptanya dengan cara yang betul. Perkara yang akhirnya saya lakukan:
Kesannya seperti yang dijangkakan. Jadi julat semasa saya ialah:
Sila ambil perhatian bahawa saya menggunakan sesi baharu melalui
countDBSession
获取计数,这不会影响*db.Gorm
参数在return db.Offset(p.Offset).Limit(p.PerPage) 的使用).Session(&gorm.Session{})