From c3518823869cc4ae5aba8a53fc7c627badefcb87 Mon Sep 17 00:00:00 2001 From: tuuz Date: Sun, 18 Feb 2024 15:15:08 +0800 Subject: [PATCH] =?UTF-8?q?v1.13.5=20FIX=20-=20=E4=BF=AE=E5=A4=8Ddb.Chunk?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=9C=A8limit=E4=B8=BA1=E6=97=B6=E5=8F=AA?= =?UTF-8?q?=E8=83=BD=E5=8F=96=E5=88=B0=E4=B8=80=E6=9D=A1=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=EF=BC=8C=E5=BD=93limit=E4=B8=BA=E5=A4=9A=E6=97=B6=E5=8F=88?= =?UTF-8?q?=E4=BC=9A=E4=B8=80=E6=AC=A1=E6=80=A7=E5=8F=96=E5=87=BA=E5=A4=9A?= =?UTF-8?q?=E6=9D=A1=E6=95=B0=E6=8D=AE=E8=80=8C=E4=B8=8D=E6=98=AF=E4=B8=80?= =?UTF-8?q?=E6=9D=A1=E4=B8=80=E6=9D=A1=E8=8E=B7=E5=8F=96=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E4=B8=80=E6=9D=A1=E5=A4=84=E7=90=86=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- orm_query.go | 48 ++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/orm_query.go b/orm_query.go index 63865c5..ca69e12 100644 --- a/orm_query.go +++ b/orm_query.go @@ -7,7 +7,6 @@ import ( "reflect" "strings" "sync" - //"fmt" ) // Select : select one or more rows , relation limit set @@ -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 @@ -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) {