我看了下 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
}