Golang Gorm 自动分批查询

场景:

目标查询全量数据,但需要每次Limit分批查询,保护数据库

文档:

https://gorm.io/zh_CN/docs/advanced_query.html

go 复制代码
// Param: 
// dest      目标地址
// batchSize 大小
// fc        处理函数

func (db *DB) FindInBatches(dest interface{}, batchSize int, fc func(tx *DB, batch int) error) *DB {...}

特点:

  • 按照主键ID做offset,效率高。
  • 写法简单
  • 可以支持对每一批查询到的记录处理

注意点:

如果目标是查询到所有结果。由于该方法每次查询到的结果会丢弃,需要手动将查询到的结果补充到外部大列表中。

go 复制代码
records := make([]*model.Record, 0)
tempRecord := make([]*model.Record, 0)
db := client.DB(ctx).Model(&model.Record{}).
    Where("valid_month = ?", month)
// 每次查询500,结果拼接到records大列表
err := db.FindInBatches(&tempRecord, 500,
    func(tx *gorm.DB, batch int) error {
       records = append(records, tempRecord...)
       return nil
    }).Error   
if err != nil{...}

实际执行显示:

总共1408条数据,每一批查询500个,查询三次,最后将结果拼接到大列表中。

go 复制代码
GORM LOG SQL:SELECT* FROM record WHERE valid month=202401 ORDER BY record.id LIMIT 500 Rows:500 Cost:17.45ms

GORM LOG SOL:SELECT* FROM record WHERE valid month=202401 AND ban_record.id> 123123 ORDER BY record.id LIMIT 500 ROWS: 500 Cost:12.88ms

GORM LOG SOL:SELECT* FROM record WHERE valid month=202401 AND ban_record.id> 456456 ORDER BY record.id LIMIT 500 ROWS: 408 Cost:15.08ms
相关推荐
paopaokaka_luck1 小时前
基于SpringBoot+Vue的电影售票系统(协同过滤算法)
vue.js·spring boot·后端
专注VB编程开发20年1 小时前
javascript的类,ES6模块写法在VSCODE中智能提示
开发语言·javascript·vscode
IT_10247 小时前
Spring Boot项目开发实战销售管理系统——系统设计!
大数据·spring boot·后端
ai小鬼头8 小时前
AIStarter最新版怎么卸载AI项目?一键删除操作指南(附路径设置技巧)
前端·后端·github
Touper.8 小时前
SpringBoot -- 自动配置原理
java·spring boot·后端
黄雪超8 小时前
JVM——函数式语法糖:如何使用Function、Stream来编写函数式程序?
java·开发语言·jvm
ThetaarSofVenice8 小时前
对象的finalization机制Test
java·开发语言·jvm
思则变8 小时前
[Pytest] [Part 2]增加 log功能
开发语言·python·pytest
一只叫煤球的猫8 小时前
普通程序员,从开发到管理岗,为什么我越升职越痛苦?
前端·后端·全栈
一只鹿鹿鹿9 小时前
信息化项目验收,软件工程评审和检查表单
大数据·人工智能·后端·智慧城市·软件工程