golang 分页获取 db 记录

2023/11/28 golang 共 1319 字,约 4 分钟
package main

import (
	"fmt"
	"gorm.io/driver/sqlite"
	"gorm.io/gorm"
)

// 定义模型
type User struct {
	ID   uint
	Name string
	Addr string
	Age  int
}

func main() {
	// 连接数据库
	db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
	if err != nil {
		panic("无法连接到数据库")
	}

	// 自动迁移模型
	// db.AutoMigrate(&User{})

	// 查询条件
	var conditions []func(db *gorm.DB) *gorm.DB
	conditions = append(conditions, WithName("John"))
	conditions = append(conditions, WithAge(25))
	conditions = append(conditions, WithAddr("%shanghai%"))

	// 分页
	pageSize := 10
	page := 1

	// 构建查询
	query := db.Model(&User{})
	for _, condition := range conditions {
		query = condition(query)
	}

	// 获取记录总数
	var totalCount int64
	query.Count(&totalCount)

	// 分页查询
	var users []User
	err = query.Limit(pageSize).Offset((page - 1) * pageSize).Find(&users).Error
	if err != nil {
		panic("查询失败")
	}

	// 处理查询结果
	for _, user := range users {
		fmt.Printf("ID: %d, Name: %s, Age: %d\n", user.ID, user.Name, user.Age)
	}

	// 打印记录总数
	fmt.Printf("总记录数: %d\n", totalCount)
}

// WithName 构建根据 Name 查询的条件
func WithName(name string) func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {
		return db.Where("name = ?", name)
	}
}

// WithAge 构建根据 Age 查询的条件
func WithAge(age int) func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {
		return db.Where("age = ?", age)
	}
}

// WithAddr 构建根据 Addr 查询的条件
func WithAddr(addr string) func(db *gorm.DB) *gorm.DB {
	return func(db *gorm.DB) *gorm.DB {
		return db.Where("addr like ?", addr)
	}
}

Search

    Table of Contents