浏览代码

批量插入fix bug

marion 5 年之前
父节点
当前提交
8ac9e0963e
共有 2 个文件被更改,包括 31 次插入22 次删除
  1. 28 19
      utils/db_utils.go
  2. 3 3
      utils/logger/xorm_logger.go

+ 28 - 19
utils/db_utils.go

@@ -54,34 +54,43 @@ func TransInsertWithSize(trans *xorm.Session, size int, beans ...interface{}) er
 	for _, bean := range beans {
 	for _, bean := range beans {
 		sliceValue := reflect.Indirect(reflect.ValueOf(bean))
 		sliceValue := reflect.Indirect(reflect.ValueOf(bean))
 		if sliceValue.Kind() == reflect.Slice {
 		if sliceValue.Kind() == reflect.Slice {
+			sLen := sliceValue.Len()
+			if sLen == 0 {
+				continue
+			}
+			if sLen <= size {
+				objects = append(objects, bean)
+				continue
+			}
+			idx := 0
+			arrMap := make(map[int][]interface{})
 			for i := 0; i < sliceValue.Len(); i++ {
 			for i := 0; i < sliceValue.Len(); i++ {
+				if i%size == 0 {
+					idx++
+				}
 				v := sliceValue.Index(i)
 				v := sliceValue.Index(i)
+				if v.Kind() == reflect.Ptr {
+					v = v.Elem()
+				}
 				elemValue := v.Interface()
 				elemValue := v.Interface()
-				objects = append(objects, elemValue)
+				if nil == arrMap[idx] {
+					arrMap[idx] = []interface{}{elemValue}
+				} else {
+					arrMap[idx] = append(arrMap[idx], elemValue)
+				}
+			}
+			for i := 1; i <= idx; i++ {
+				arr := arrMap[i]
+				objects = append(objects, &arr)
 			}
 			}
 		} else {
 		} else {
 			objects = append(objects, bean)
 			objects = append(objects, bean)
 		}
 		}
 	}
 	}
 
 
-	total := len(objects)
-	var err error
-	if total <= size {
-		_, err = trans.Insert(&objects)
+	_, err := trans.Insert(objects...)
+	if nil != err {
 		return err
 		return err
 	}
 	}
-
-	for i := 0; i < total; i += size {
-		end := i + size
-		if end > total {
-			end = total
-		}
-		arr := objects[i:end]
-		_, err = trans.Insert(&arr)
-		if nil != err {
-			return err
-		}
-	}
-
-	return err
+	return nil
 }
 }

+ 3 - 3
utils/logger/xorm_logger.go

@@ -1,8 +1,8 @@
 package logger
 package logger
 
 
 import (
 import (
-	"github.com/go-xorm/core"
 	"github.com/sirupsen/logrus"
 	"github.com/sirupsen/logrus"
+	"xorm.io/core"
 )
 )
 
 
 type XORMLogger struct {
 type XORMLogger struct {
@@ -29,7 +29,7 @@ func NewXORMLogger(logger *Logger) core.ILogger {
 	return lg
 	return lg
 }
 }
 
 
-func (s *XORMLogger) printSql(v ...interface{})  {
+func (s *XORMLogger) printSql(v ...interface{}) {
 	var sql, params interface{}
 	var sql, params interface{}
 	if len(v) > 0 {
 	if len(v) > 0 {
 		sql = v[0]
 		sql = v[0]
@@ -41,7 +41,7 @@ func (s *XORMLogger) printSql(v ...interface{})  {
 	} else {
 	} else {
 		params = nil
 		params = nil
 	}
 	}
-	args := []interface{} {"sql", "", 0, sql, params, MaxInt64}
+	args := []interface{}{"sql", "", 0, sql, params, MaxInt64}
 	s.logger.Print(args...)
 	s.logger.Print(args...)
 }
 }