Skip to content

Commit

Permalink
v1.13.5 FIX
Browse files Browse the repository at this point in the history
- 修复db.Chunk功能在limit为1时只能取到一条数据,当limit为多时又会一次性取出多条数据而不是一条一条获取一条一条处理的BUG
  • Loading branch information
tobycroft committed Feb 18, 2024
1 parent ef8e4a4 commit c351882
Showing 1 changed file with 44 additions and 4 deletions.
48 changes: 44 additions & 4 deletions orm_query.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import (
"reflect"
"strings"
"sync"
//"fmt"
)

// Select : select one or more rows , relation limit set
Expand Down Expand Up @@ -394,11 +393,14 @@ func (dba *Orm) Chunk(limit int, callback func([]Data) error) (err error) {
var tabname = dba.GetISession().GetIBinder().GetBindName()
prefix := dba.GetISession().GetIBinder().GetBindPrefix()
tabname2 := strings.TrimPrefix(tabname, prefix)
where, fields, group := dba.where, dba.fields, dba.group

// 先执行一条看看是否报错, 同时设置指定的limit, offset
result, err := dba.Table(tabname2).Limit(limit).Page(page).Get()
if err != nil {
dba.Table(tabname2).Limit(limit).Page(page)
if err = dba.Select(); err != nil {
return
}
result := dba.GetBindAll()
for len(result) > 0 {
if err = callback(result); err != nil {
break
Expand All @@ -407,11 +409,49 @@ func (dba *Orm) Chunk(limit int, callback func([]Data) error) (err error) {
// 清理绑定数据, 进行下一次操作, 因为绑定数据是每一次执行的时候都会解析并保存的
// 而第二次以后执行的, 都会再次解析并保存, 数据结构是slice, 故会累积起来
dba.ClearBindValues()
result, _ = dba.Page(page).Get()
dba.where, dba.fields, dba.group = where, fields, group
dba.Table(tabname2).Limit(limit).Page(page)
if err = dba.Select(); err != nil {
break
}
result = dba.GetBindAll()
}
return
}

// ChunkWG : ChunkWG是在Chunk的基础上,新增带有多线程性质的处理方式,理论性能将会有30%左右的提升,需要处理的数据量越大越多,比原版Chunk的提升就越明显
// 使用ChunkWG处理大量数据,请尽量保证有足够多的连接数,避免影响程序其他需要数据库的部分连接进入等待状态
func (dba *Orm) ChunkWG(limit int, callback func([]Data) error) (err error) {
//var page = 1
//var tabname = dba.GetISession().GetIBinder().GetBindName()
//prefix := dba.GetISession().GetIBinder().GetBindPrefix()
//tabname2 := strings.TrimPrefix(tabname, prefix)
//where, fields, group := dba.where, dba.fields, dba.group
//
//// 先执行一条看看是否报错, 同时设置指定的limit, offset
//dba.Table(tabname2).Limit(limit).Page(page)
//if err = dba.Select(); err != nil {
// return
//}
//result := dba.GetBindAll()
//for len(result) > 0 {
// if err = callback(result); err != nil {
// break
// }
// page++
// // 清理绑定数据, 进行下一次操作, 因为绑定数据是每一次执行的时候都会解析并保存的
// // 而第二次以后执行的, 都会再次解析并保存, 数据结构是slice, 故会累积起来
// dba.ClearBindValues()
// dba.where, dba.fields, dba.group = where, fields, group
// dba.Table(tabname2).Limit(limit).Page(page)
// if err = dba.Select(); err != nil {
// break
// }
// result = dba.GetBindAll()
//}
return
}

// ChunkStruct : 同Chunk,只不过不用返回map, 而是绑定数据到传入的对象上
// 这里一定要传入绑定struct
func (dba *Orm) ChunkStruct(limit int, callback func() error) (err error) {
Expand Down

1 comment on commit c351882

@tobycroft
Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#4

Please sign in to comment.