Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Golang melaksanakan paging

Golang melaksanakan paging

WBOY
WBOYasal
2023-05-22 12:12:071724semak imbas

Dengan perkembangan teknologi Internet dan jumlah data yang semakin meningkat, pertanyaan halaman untuk data menjadi semakin biasa. Dalam golang, pertanyaan paging tidak terlalu menyusahkan, dan kecekapan paging boleh dipertingkatkan melalui beberapa pengoptimuman.

1. Paging asas

Dalam golang, cara paling asas untuk pertanyaan paging ialah menggunakan klausa had dalam pernyataan sql. Contohnya:

SELECT * FROM table LIMIT offset, limit;

di mana offset mewakili ofset dan had mewakili bilangan rekod yang dikembalikan. Sebagai contoh, jika 10 keping data dipaparkan pada setiap halaman, maka pernyataan SQL pada halaman 1 ialah:

SELECT * FROM table LIMIT 0, 10;

Pernyataan SQL pada halaman 2 ialah:

SELECT * FROM table LIMIT 10, 10;

Kaedah ini memerlukan pengiraan manual daripada offset setiap halaman Mengukur dan merekodkan kuantiti adalah menyusahkan dan mudah ralat. Oleh itu, kita boleh menggunakan beberapa perpustakaan untuk memudahkan pelaksanaan pertanyaan penomboran.

2. Gunakan perpustakaan gorm untuk melaksanakan paging

gorm ialah perpustakaan orm golang yang biasa digunakan, yang menyediakan kaedah pertanyaan paging yang sangat mudah. Kami boleh menggunakan kaedah Had dan Offset terbina dalam untuk melaksanakan pertanyaan halaman. Contohnya:

db.Limit(10).Offset(0).Find(&users)

Antaranya, kaedah Had mewakili bilangan rekod yang dikembalikan, kaedah Offset mewakili ofset dan kaedah Cari digunakan untuk melaksanakan pertanyaan.

Berikut ialah contoh mudah untuk menunjukkan cara menggunakan perpustakaan gorm untuk melaksanakan pertanyaan paging:

package main

import (
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
    Id   int
    Name string
    Age  int
}

func main() {
    db, _ := gorm.Open("mysql", "root:123456@/test?charset=utf8mb4&parseTime=True&loc=Local")

    defer db.Close()

    // 创建表
    db.AutoMigrate(&User{})

    // 添加测试数据
    for i := 0; i < 100; i++ {
        user := User{Id: i + 1, Name: fmt.Sprintf("user%d", i+1), Age: i%20 + 10}
        db.Create(&user)
    }

    // 分页查询
    page := 5       // 第5页
    pageSize := 10   // 每页10条记录
    offset := (page - 1) * pageSize // 计算偏移量
    var users []User

    // 查询第5页的记录
    db.Limit(pageSize).Offset(offset).Find(&users)

    // 输出结果
    for _, user := range users {
        fmt.Printf("ID: %d, Name: %s, Age: %d
", user.Id, user.Name, user.Age)
    }
}

Jalankan kod di atas, hasil output ialah:

ID: 41, Name: user41, Age: 10
ID: 42, Name: user42, Age: 11
ID: 43, Name: user43, Age: 12
ID: 44, Name: user44, Age: 13
ID: 45, Name: user45, Age: 14
ID: 46, Name: user46, Age: 15
ID: 47, Name: user47, Age: 16
ID: 48, Name: user48, Age: 17
ID: 49, Name: user49, Age: 18
ID: 50, Name: user50, Age: 19

3 . Gunakan perpustakaan paging Melaksanakan paging

Selain menggunakan kaedah paging terbina dalam gorm, kami juga boleh menggunakan beberapa perpustakaan paging pihak ketiga untuk melaksanakan paging. Contohnya:

  1. paginator

paginator ialah perpustakaan paging golang ringan yang menyokong mysql, postgres, sqlite3 dan pangkalan data lain. Ia sangat mudah untuk digunakan, hanya nyatakan nombor halaman semasa, bilangan rekod setiap halaman dan jumlah bilangan rekod. Berikut ialah contoh:

package main

import (
    "fmt"
    "github.com/biezhi/gorm-paginator/pagination"
    _ "github.com/jinzhu/gorm/dialects/mysql"
    "github.com/jinzhu/gorm"
)

type User struct {
    Id   uint `gorm:"primary_key"`
    Name string
    Age  uint
}

func main() {
    db,_ := gorm.Open("mysql", "root:123456@/test?charset=utf8mb4&parseTime=True&loc=Local")

    var users []User
    pagination.Paging(&pagination.Param{
        DB:      db,
        Page:    5,
        Limit:   10,
        OrderBy: []string{"id desc"},
        ShowSQL: true,
    }, &users)

    for _, user := range users {
        fmt.Printf("ID: %d, Name: %s, Age: %d
", user.Id, user.Name, user.Age)
    }
}
  1. go-paginator

go-paginator ialah satu lagi perpustakaan paging golang ringan yang tidak bergantung pada mana-mana pangkalan data dan sangat mudah digunakan . Berikut ialah contoh:

package main

import (
    "fmt"
    "github.com/liyuliang/go-paginator"
)

type User struct {
    Id   uint
    Name string
    Age  uint
}

func main() {
    var users []User
    pageSize := 10                                    // 每页记录数
    page, _ := paginator.New(paginator.Config{        // 初始化分页器
        CurrentPage: 5,                               // 当前页码
        PageSize:    pageSize,                         // 每页记录数
        Total:       100,                              // 总记录数
    })

    records := make([]interface{}, 100)                // 模拟100条记录
    for i := 0; i < 100; i++ {
        user := User{Id: uint(i + 1), Name: fmt.Sprintf("user%d", i+1), Age: uint(i%20 + 10)}
        records[i] = user
    }

    pageData := page.Data(records)                     // 获取分页数据
    offset := (page.CurrentPage - 1) * pageSize         // 计算偏移量
    users = pageData[offset : offset+pageSize].([]User) // 获取当前页的记录

    for _, user := range users {
        fmt.Printf("ID: %d, Name: %s, Age: %d
", user.Id, user.Name, user.Age)
    }
}

Walau bagaimanapun, perlu diingatkan bahawa perpustakaan paging biasanya memerlukan kami mengira jumlah rekod secara manual, yang mungkin menjejaskan kecekapan pertanyaan. Oleh itu, jika jumlah rekod tidak begitu besar, kita tidak boleh menggunakan perpustakaan paging, tetapi gunakan kaedah paging terbina dalam gorm.

4. Pengoptimuman paging

Dalam aplikasi sebenar, pertanyaan paging mungkin menghadapi beberapa masalah prestasi, terutamanya apabila jumlah data adalah besar. Untuk meningkatkan kecekapan pertanyaan, beberapa kaedah pengoptimuman berikut boleh digunakan:

  1. Gunakan caching

Jika data tidak perlu dikemas kini dalam masa nyata, keputusan pertanyaan boleh dicache dalam ingatan untuk kali seterusnya Dapatkan data terus daripada cache semasa capaian untuk mengelakkan capaian yang kerap kepada pangkalan data.

  1. Kurangkan bilangan medan yang dikembalikan

Jika rekod pertanyaan mengandungi sejumlah besar medan, anda hanya boleh mengembalikan beberapa medan untuk mengelakkan pertanyaan sejumlah besar data yang tidak diperlukan .

  1. Gunakan indeks

Tambahkan indeks pada medan yang sering ditanya, yang boleh meningkatkan kecekapan pertanyaan.

  1. Pertanyaan kelompok

Apabila jumlah data adalah besar, pertanyaan kelompok boleh digunakan untuk menanyakan sekumpulan data pada satu masa untuk mengelakkan pertanyaan terlalu banyak data sekaligus menyebabkan ketidakcekapan.

Secara amnya, sangat mudah untuk melaksanakan pertanyaan paging dalam golang Melalui perpustakaan gorm terbina dalam dan perpustakaan paging pihak ketiga, kami boleh melaksanakan fungsi paging dengan mudah dan boleh meningkatkan kecekapan pertanyaan melalui beberapa pengoptimuman. .

Atas ialah kandungan terperinci Golang melaksanakan paging. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:golang atau cppArtikel seterusnya:golang atau cpp