go gin 框架自己封装的 mysql 批量插入方法

36 阅读1分钟

我看了下 gorm 文档,好像没有找到批量插入的方法,就自己写了个,大家可以参考下 官方文档可能有,如果大家看到的话欢迎评论哈哈

这里主要用的是反射,定义结构体的时候注意在后面加上:gorm:"column:title"

// 这个批量插入定死了数据格式,例:string `gorm:"column:title"`,后续可以优化,不过感觉也顶多换个形式
func BatchInsert(tableName string, data interface{}) (string, []interface{}, error) {
	valueOf := reflect.ValueOf(data)
	if valueOf.Kind() != reflect.Slice {
		return "", nil, fmt.Errorf("data is not a slice")
	}

	sliceLen := valueOf.Len()
	if sliceLen == 0 {
		return "", nil, fmt.Errorf("data slice is empty")
	}

	elemType := valueOf.Index(0).Type()
	columns := make([]string, 0, elemType.NumField())
	values := make([]string, 0, sliceLen)
	params := make([]interface{}, 0, sliceLen*elemType.NumField())

	for i := 0; i < elemType.NumField(); i++ {
		field := elemType.Field(i)
		columnName := field.Tag.Get("gorm")
		columnName = strings.Split(columnName, "column:")[1]
		columns = append(columns, columnName)
	}

	for i := 0; i < sliceLen; i++ {
		elem := valueOf.Index(i)
		elemValues := make([]string, elemType.NumField())
		for j := 0; j < elemType.NumField(); j++ {
			fieldValue := elem.Field(j)
			elemValues[j] = "?"
			params = append(params, fieldValue.Interface())
		}

		values = append(values, "("+strings.Join(elemValues, ",")+")")
	}

	sql := fmt.Sprintf("INSERT INTO %s (%s) VALUES %s", tableName, strings.Join(columns, ","), strings.Join(values, ","))

	return sql, params, nil
}