[golang]gorm 大批量更新数据库内容

使用情况: 数据需要基于本地进行更新到数据库, 比如前端提交多个用户的数据

正常思维, 获取数据直接更新

有个问题, 如果数据量很大, 速度会很慢,本地测试20000条数据要20s级别

type User struct {
    gorm.Model
    Name     string `gorm:"uniqueIndex"`
    Nickname string
    Email    string
}

func BatchUpdate(db *gorm.DB) {
    // 获取到前端数据
    var localUsers []User

    // 遍历并更具条件更新
    for _, user := range localUsers {
        db.Model(user).Where("name = ?", user.Name).Update("email", user.Email).Update("nickname", user.Nickname)
    }
}

正确做法

先拿到数据库数据, 然后本地与数据库数据缓存对比, 然后写入数据库缓存, 20000数据在200ms级别

使用自带的save 比update快很多, 不知道为啥, 有兴趣的自己Debug看sql

func BatchUpdate(db *gorm.DB) {

    // 拿到数据库数据
    var dbUsers []User
    db.Model(User{}).Find(&dbUsers)

    // 使用map储存 空间换时间
    var dbUserMap map[string]User
    for _, user := range dbUsers {
        dbUserMap[user.Name] = user
    }

    // 拿到本地要修改的数据
    var localUsers []User

    for _, localUser := range localUsers {

        if dbUser, exist := dbUserMap[localUser.Name]; exist {
            dbUser.Nickname = localUser.Nickname
            dbUser.Email = localUser.Email
            // 使用自带的save进行保存, 速度嘎嘎快
            db.Save(dbUser)
        }
    }
}

给TA充电
共{{data.count}}人
人已充电
js编程

[vue]创建使用 typescript 创建插件

2024-5-8 0:40:42

go编程

[Golang] Awesome Go

2024-7-4 16:09:02

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
今日签到
搜索