func updateClientAuthData(db *gorm.DB, data []map[uint]string) {
logger.Debug(len(data))
if len(data) < 1 {
return
}
var (
ids string
isBreak bool
peak int = 10
newData []map[uint]string
)
if len(data) >= peak {
isBreak = true
}
buff := bytes.Buffer{}
sql := fmt.Sprintf(`UPDATE rel_client_product SET options = CASE id `)
buff.WriteString(sql)
stop:
for i, v := range data {
for k, v1 := range v {
if ids == "" {
ids = strconv.Itoa(int(k))
}else {
ids = ids + "," + strconv.Itoa(int(k))
}
if i == peak || i == len(data)-1{
buff.WriteString(fmt.Sprintf(`WHEN %d THEN '%s' END `, k, v1))
} else {
buff.WriteString(fmt.Sprintf(`WHEN %d THEN '%s' `, k, v1))
}
if isBreak{
if i >= peak {
newData = append(newData, data[peak+1:]...)
break stop
}
}
}
}
logger.Debug(ids)
args := fmt.Sprintf(`WHERE id IN (%v)`, ids)
buff.WriteString(args)
if err := db.Debug().Exec(buff.String()).Error; err != nil {
logger.Error(err)
return
}
if isBreak{
updateClientAuthData(db, newData)
}
}
golang批量更新mysql数据
最新推荐文章于 2024-06-27 16:40:50 发布
该代码片段展示了如何使用GORM库批量更新`rel_client_product`表中的数据,通过CASE语句设置options字段。当数据量过大时,它会分批处理,以避免一次性更新大量记录导致的性能问题。
摘要由CSDN通过智能技术生成