Rumah > Soal Jawab > teks badan
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粉4652875922024-02-04 17:11:07
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{})