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
相关推荐
Evand J20 小时前
【MATLAB代码介绍】【空地协同】UAV辅助的UGV协同定位,无人机辅助地面无人车定位,带滤波,MATLAB
开发语言·matlab·无人机·协同·路径·多机器人
sa1002721 小时前
基于Python的京东评论爬虫
开发语言·爬虫·python
foundbug99921 小时前
STFT在图像配准中的MATLAB实现
开发语言·matlab
ii_best21 小时前
安卓/ios脚本开发辅助工具按键精灵横纵坐标转换教程
android·开发语言·ios·安卓
IT_陈寒21 小时前
React 19 实战:5个新特性让你的开发效率提升50%!
前端·人工智能·后端
a31582380621 小时前
Android 大图显示策略优化显示(二)
android·java·开发语言·javascript·kotlin·glide·图片加载
米优21 小时前
srs媒体流服务器二次开发-实现读取配置文件功能
服务器·后端·媒体
计算机毕设VX:Fegn089521 小时前
计算机毕业设计|基于springboot + vue律师咨询系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
月明长歌21 小时前
Java多线程线程池ThreadPoolExecutor理解总结:6 个核心参数 + 4 种拒绝策略(附完整示例)
java·开发语言
学编程的小鬼21 小时前
JVM 常见的问题
开发语言·jvm