zhangqian
2024-07-23 bb455e9304722ad83fd65203c3cd370f5f3844c3
物料导入分批插入数据库解决数据量大无法导入的问题
2个文件已修改
54 ■■■■ 已修改文件
pkg/slicex/slicex.go 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/material.go 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pkg/slicex/slicex.go
@@ -12,3 +12,13 @@
    }
    return result
}
// SplitSlice 分割泛型切片
func SplitSlice[T any](slice []T, size int) [][]T {
    var result [][]T
    for size < len(slice) {
        slice, result = slice[size:], append(result, slice[0:size:size])
    }
    result = append(result, slice)
    return result
}
service/material.go
@@ -184,20 +184,38 @@
        return 0, errors.New("物料数据为空")
    }
    err = models.WithTransaction(func(db *gorm.DB) error {
        if err := models.NewMaterialSearch().SetOrm(db).CreateBatch(materialList); err != nil {
            return err
        for i := 0; i < len(materialList); i += 500 {
            end := i + 500
            if end > len(materialList) {
                end = len(materialList)
            }
            arr := materialList[i:end]
            if len(arr) != 0 {
                if err := models.NewMaterialSearch().SetOrm(db).CreateBatch(arr); err != nil {
                    return err
                }
            }
        }
        if len(attributeValueList) != 0 {
            err = models.NewAttributeValueSearch().SetOrm(db).CreateBatch(attributeValueList)
            if err != nil { //批量插入失败(可能已经存在值),分开一条一条插入重复的不插入
                for _, avl := range attributeValueList {
                    first, err2 := models.NewAttributeValueSearch().SetAttributeID(avl.AttributeID).SetEntityID(avl.EntityID).First()
                    if err2 == nil && first != nil { //表示已经存在动态属性
                        continue
                    }
                    err2 = models.NewAttributeValueSearch().SetOrm(db).Create(avl)
                    if err2 != nil {
                        return err
        for i := 0; i < len(attributeValueList); i += 500 {
            end := i + 500
            if end > len(attributeValueList) {
                end = len(attributeValueList)
            }
            arr := attributeValueList[i:end]
            if len(arr) != 0 {
                if err := models.NewAttributeValueSearch().SetOrm(db).CreateBatch(arr); err != nil {
                    return err
                }
                if err != nil { //批量插入失败(可能已经存在值),分开一条一条插入重复的不插入
                    for _, avl := range arr {
                        first, err2 := models.NewAttributeValueSearch().SetAttributeID(avl.AttributeID).SetEntityID(avl.EntityID).First()
                        if err2 == nil && first != nil { //表示已经存在动态属性
                            continue
                        }
                        err2 = models.NewAttributeValueSearch().SetOrm(db).Create(avl)
                        if err2 != nil {
                            return err
                        }
                    }
                }
            }