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
相关推荐
bobz9657 分钟前
kubevirt 替换为 hostnetwork 的优势
后端
大象席地抽烟8 分钟前
Nginx Ingress 证书
后端
心之语歌9 分钟前
Java 设计 MCP SSE 配置
java·后端
华仔啊24 分钟前
推荐一款比Cursor更懂中国程序员的AI编程工具
前端·后端
海风极客31 分钟前
Ping命令这种事情用Go也能优雅实现
后端·go·github
天天摸鱼的java工程师1 小时前
“你能从字节码层面解释JVM内存模型吗?”——面试官的死亡提问
java·后端·面试
落羽的落羽1 小时前
【C++】神奇的AVL树
开发语言·数据结构·c++·学习
这里有鱼汤1 小时前
分享一个年化96%的小市值策略
后端
西京刀客1 小时前
构建 Go 可执行文件镜像 | 探索轻量级 Docker 基础镜像(我应该选择哪个 Docker 镜像?)
开发语言·docker·golang
LaoZhangAI1 小时前
沉浸式翻译API深度解析:500万用户的翻译神器如何配置[2025完整指南]
前端·后端