go 学习 第二十八章 Go语言 gorm 使用limit , offset, count 实现分页

本文介绍了如何使用Go语言的Gorm库进行分页操作,包括Limit用于设置查询的最大记录数,Offset指定跳过的记录数,以及Count用于获取模型的记录数。在实际应用中,Limit和Offset常常结合使用,但Count不能与Offset或负值Offset配合,否则会出现错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.  Limit 

     Limit 指定要查询的最大记录数。

     示例:

      取出时间倒叙的最后5条记录

db.Order("created_at desc").Limit(5).Find(&users)

2.  Offset

     Offset指定开始返回记录前要跳过的记录数。      

     ※ offset 需要配合limit 使用

db.Limit(5).Offset(5).Order("created_at desc").Find(&users)

3. count

    获取模型的记录数。

   ※ 使用count  不能用 Offset 或将Offset值设为 -1(-1代表取消offset限制)

            否则会报 :sql: no rows in result set  的错误。

db.Limit(5).Offset(-1).Order("created_at desc").Find(&users).Count(&count)

// 或 

db.Model(&User{}).Where("name = ?", "jinzhu").Count(&count)

4.  分页实例

package main

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

type User struct {
	gorm.Model
	Name string `gorm:"default:''"`
	IsMan bool `gorm:"not null;default:false"`
	Price *int `gorm:"default:0"`
}


func main() {
	db, err := gorm.Open("mysql", "root:root@/gormdb?charset=utf8&parseTime=True&loc=Local")
	defer db.Close()
	if err != nil {
		panic(err)
	}

	defer db.Close()
	//生成数据库表
	//db.AutoMigrate(&User{})

	//db.Create(&User{Name:"shijia1"})

	var users []User

	var page int = 2
	var pageSize int = 5
	var total int = 0

	// 获取取指page,指定pagesize的记录
	db.Where("price >= ?",0).Limit(pageSize).Offset((page-1)*pageSize).Order("created_at desc").Find(&users)

	// 获取总条数
	db.Model(&User{}).Where("price >= ?",0).Count(&total)
	fmt.Println(users,"总数:",total)



}

 

GORM 中,可以使用 `Raw` 方法结合 `Scan` 方法进行多表联合查询,并且使用 `Count` 方法对查询结果进行计数和分页查询。 下面是一个例子: ```go type User struct { ID uint Name string } type Order struct { ID uint UserID uint Product string } var ( count int64 offset int limit int = 10 ) // 使用 Raw 方法进行 SQL 查询 db.Raw("(SELECT COUNT(*) FROM users) UNION ALL (SELECT COUNT(*) FROM orders)").Scan(&count) // 计算分页参数 totalPages := int(math.Ceil(float64(count) / float64(limit))) if page > totalPages { page = totalPages } if page < 1 { page = 1 } offset = (page - 1) * limit // 使用 Raw 方法进行 SQL 分页查询 var result []interface{} db.Raw("(SELECT id, name FROM users LIMIT ? OFFSET ?) UNION ALL (SELECT id, product FROM orders LIMIT ? OFFSET ?)", limit, offset, limit, offset).Scan(&result) fmt.Println("Total count:", count) fmt.Println("Result:", result) ``` 上述代码中,首先使用 `Raw` 方法执行了一个 SQL 查询,该查询使用 UNION ALL 关键字将两个子查询的结果合并为一个结果集,并使用 `Scan` 方法将查询结果存储在 `count` 变量中。 接下来,计算分页参数,包括总页数、当前页数、偏移量等。 最后,使用 `Raw` 方法执行了一个 SQL 分页查询,该查询也使用 UNION ALL 关键字将两个子查询的结果合并为一个结果集,并使用 `Scan` 方法将查询结果存储在 `result` 变量中。 需要注意的是,由于查询结果包含多个字段,因此需要使用一个 `[]interface{}` 类型的切片来存储查询结果。此外,由于查询结果可能包含不同类型的字段,因此需要将查询结果中的每个字段都定义为 `interface{}` 类型。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值