优秀的编程知识分享平台

网站首页 > 技术文章 正文

gorm实战笔记(三)更新数据(gorm.model)

nanyue 2024-09-09 04:58:20 技术文章 6 ℃

本节主要来讲解的如何使用gorm来更新数据库中的数据,包括Save方法、Update方法、Updates方法使用及如何进行批量更新。

保存所有字段

可以使用save字段来更新所有字段,及时字段是零值

    var user User
    db, _ := GetMysqlDb("root", "123456", "192.168.188.155", 3306, "szkfpt")
    db.First(&user)

    user.Name = "jinzhu 2"
    user.Age = 100
    // UPDATE `users` SET `name`='jinzhu 2',`email`=NULL,
    //`age`=100,`birthday`='2024-03-21 16:52:50.665',`member_number`=NULL,
    //`activated_at`=NULL,`created_at`='2024-03-21 16:52:50.69',
    //`updated_at`='2024-03-25 16:25:08.448' WHERE `id` = 1
    db.Save(&user)

从上面输出的sql语句可以看到,User结构体中的所有字段都被更新了,及时字段为空也会被更新。

save方法是一个组合方法,如果保存的值不存在主键,就会进行新建!

如果存在主键,那么就会进行更新。

    // INSERT INTO `users` (`name`,`email`,`age`,`birthday`,`member_number`,`activated_at`,`created_at`,`updated_at`) 
    // VALUES ('jinzhu8',NULL,22,NULL,NULL,NULL,'2024-03-25 16:38:58.857','2024-03-25 16:38:58.857')
    db.Save(&User{
        Name:      "jinzhu8",
        Age:       22,
        CreatedAt: time.Now(),
        UpdatedAt: time.Now(),
    })
    // UPDATE `users` SET `name`='jinzhu',`email`=NULL,`age`=100,`birthday`=NULL,`member_number`=NULL,
    //`activated_at`=NULL,`created_at`='2024-03-25 16:38:58.859',`updated_at`='2024-03-25 16:38:58.86' WHERE `id` = 1
    db.Save(&User{ID: 1, Name: "jinzhu", Age: 100, CreatedAt: time.Now()})

上面的第一次的Save方法调用,由于主键Id没有赋值,所以执行了保存操作。第二次调用,由于指定ID为1,那么执行的是一个更新操作。

更新单个列

当使用 Update 更新单列时,需要有一些条件,否则将会引起ErrMissingWhereClause 错误,查看 阻止全局更新 了解详情。 当使用 Model 方法,并且它有主键值时,主键将会被用于构建条件,例如:

    var user User
    db, _ := GetMysqlDb("root", "123456", "192.168.188.155", 3306, "szkfpt")
    // 根据条件更新
    // UPDATE `users` SET `name`='hello',`updated_at`='2024-03-25 16:57:52.216' WHERE age = 18;
    db.Model(&User{}).Where("age = ?", 18).Update("name", "hello")

    // User 的 ID 是 1
    // UPDATE `users` SET `name`='hello',`updated_at`='2024-03-25 16:57:52.227' WHERE `id` = 1
    db.Model(&User{ID: 1}).Update("name", "hello")


    // 根据条件和 model 的值进行更新
    // UPDATE `users` SET `name`='hello',`updated_at`='2024-03-25 16:57:52.23' WHERE age = 100
    db.Model(&user).Where("age = ?", 100).Update("name", "hello")

更新多列

gorm的Updates方法支持更新struct和map[string]interface{}参数,当参数是在结构体的时候,默认情况下只会更新非零值的字段

    var user = User{
        ID: 1,
    }
    db, _ := GetMysqlDb("root", "123456", "192.168.188.155", 3306, "szkfpt")
    // 根据 `struct` 更新属性,只会更新非零值的字段
    // UPDATE `users` SET `name`='hello',`updated_at`='2024-03-25 17:14:10.48' WHERE `id` = 1
    db.Model(&user).Updates(User{Name: "hello", Age: 0})

    // 根据 `map` 更新属性
    // UPDATE `users` SET `age`=0,`name`='hello',`updated_at`='2024-03-25 17:14:10.494' WHERE `id` = 1
    db.Model(&user).Updates(map[string]interface{}{"name": "hello", "age": 0})

更新选定字段

// UPDATE `users` SET `name`='hello2',`updated_at`='2024-03-25 17:33:01.714' WHERE `id` = 1
    db.Model(&User{ID: 1}).Select("name").Updates(map[string]interface{}{"name": "hello2", "age": 18, "active": false})

可以通过Select方法来选定特定字段来进行更新

批量更新

    db, _ := GetMysqlDb("root", "123456", "192.168.188.155", 3306, "szkfpt")
    
  // UPDATE `users` SET `name`='hello',`age`=18,`updated_at`='2024-03-25 17:41:13.394' WHERE name = 'hello2'
    db.Model(User{}).Where("name = ?", "hello2").Updates(User{
        Name: "hello",
        Age:  18,
    })



Tags:

最近发表
标签列表