美文网首页
gorm-V2-06-更新

gorm-V2-06-更新

作者: 玄德公笔记 | 来源:发表于2022-02-17 20:17 被阅读0次

1. save (更新/创建)

主键如果查到,更新数据
主键如果未查到,插入一条数据

    liuBei := xiShu {
        ID: 9,
        Name: "GuanYu",
        Age: 30,
    }
    db.Save(&liuBei)
  • 示例
package main

import (
    "database/sql"
    "fmt"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "time"
)

type User struct {
    ID int64
    Age int64
    Name string
    Email string
    Company string
}



func main() {
    db,sqlDB,_ := connect()
    defer sqlDB.Close()

    user := User{
        ID: 2,
        Name: "GuanDi",
    }
    db.Save(&user)
    fmt.Println(user)
}


func connect() (db *gorm.DB,sqlDB *sql.DB,err error) {
    dsn := "root:40010355@tcp(127.0.0.1:3306)/crow?charset=utf8&parseTime=True&loc=Local"
    db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
    sqlDB,_ = db.DB()
    if err != nil {
        fmt.Printf(err.Error())
        defer sqlDB.Close()
    }else {
        fmt.Printf("OK\n")
        sqlDB.SetMaxIdleConns(10)
        sqlDB.SetMaxOpenConns(100)
        sqlDB.SetConnMaxLifetime(time.Hour)
    }
    return
}

2. Update(单列修改)

目前表:

mysql> select * from xi_shu;
+----+------------+------+
| id | name       | age  |
+----+------------+------+
|  1 | LiuBei     |   28 |
|  2 | GuanYu     |   22 |
|  3 | ZhangFei   |   20 |
+----+------------+------+
3 rows in set (0.01 sec)

2.1 根据主键修改单列

2.1.1 使用

  • 样例
db.Model(&User{ID:2}).Update("name", "WuSheng")
  • 说明

前边model中指明的条件,只有主键才能用来查询
如果要查其他键可以用Where来查询

2.1.2 示例

  • 代码

结构体中我们设置了三个成员,后边演示中可以看到,只有主键的 ID=2可以用来定位

func main() {
    db,sqlDB,_ := connect()
    defer sqlDB.Close()

    user := User {
        ID: 2,
        Name: "GuanYu",
        Age: 30,
    }
    //var users []xiShu
    db.Model(&user).Update("name", "WuSheng")
    fmt.Println(user)
}
  • 输出
OK
&{2 WuSheng 30}

可见,不管是否查到,是否更新,用来查询的结构体数据是不会发生变化的。

  • 数据库的表
mysql> select * from xi_shu where id = 2;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  2 | WuSheng |   22 |
+----+---------+------+
1 row in set (0.00 sec)

可见,表的数据中,仅按着Update()修改了name列的值
而不会因为根据查询条件的机构体改变。

2.2 单列修改(不论是否主键)

db.Model(&xiShu{}).Where("name = ?","GuanYu").Update("name", "WuSheng")

说明:
Model 指定表
Where查找要修改行,
Update 指定要修改列和内容(语法上仅能指定一列)

3. Updates(多列修改)

3.1 基本使用

  • 使用Map
db.Model(&User{}).Where("name = ?","GuanYu").Updates(map[string]interface{}{"name": "WuSheng", "age": 99})
  • 使用 struct
db.Model(&xiShu{}).Where("name = ?","GuanYu").Updates(&xiShu{Name: "WuSheng",Age: 99})

3.2 Select(限制修改字段范围)

说明:Select限制哪些字段允许修改,Update中指定列不在此范围的不可更改。

db.Model(&User{ID:2}).Select("name").Updates(map[string]interface{}{"name": "WuSheng", "age": 99})

3.2 Omit(排除修改字段范围)

说明:Select限制哪些字段允许修改,Update中指定列在此范围的不可更改。

db.Model(&xiShu{ID:2}).Omit("name").Updates(map[string]interface{}{"name": "WuSheng", "age": 99})

4. 钩子

4.1 创建钩子

  • 说明
    关于更新,允许 AfterSave、AfterUpdate两种,更新时会调用。

  • 示例

如果权限是admin,则返回错误。

func (u *User) BeforeUpdate(tx *gorm.DB) (err error) {
    if u.Role == "admin" {
        return errors.New("admin user not allowed to update")
    }
    return
}

4.2 不使用钩子

如果不想使用钩子可用UpdateColumn或UpdateColumns。

  • UpdateColumn

说明:单列不使用钩子

db.Model(&xiShu{ID:2}).UpdateColumn("name", "WuSheng")
  • UpdateColumns

说明:多列不使用钩子

db.Model(&user).UpdateColumns(User{Name: "WuSheng", Age: 99})

5. RowsAffected(修改影响行数)

func main() {
    db,sqlDB,_ := connect()
    defer sqlDB.Close()

    result := db.Table("users").Where("id IN (?)", []int{1,2,3}).Update("Age",11).RowsAffected
    fmt.Println(result)
}

输出

OK
3

1、2、3 三行被修改,输出为3。

6. Expr(带有表达式的sql更新)

  • 示例

将id=2 的用户 年龄X2+100

func main() {
    db,sqlDB,_ := connect()
    defer sqlDB.Close()
    user := User{
        ID: 2,
    }
    db.Model(&user).Update("age", gorm.Expr("age * ? + ?", 2, 100))
    fmt.Println(user)
}

表结果

mysql> select * from xi_shu where id = 2;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  2 | WuSheng |  144 |
+----+---------+------+
1 row in set (0.00 sec)

如上,关羽的年龄从22修改为144

相关文章

  • gorm-V2-06-更新

    1. save (更新/创建) 主键如果查到,更新数据主键如果未查到,插入一条数据 示例 2. Update(单列...

  • 更新,更新 更新。

    A君姥爷去世好多年,一日托梦给A君,一直喊着两个字:更新!更新!更新!持续一周一直这个梦。无奈之下只好去姥爷的坟头...

  • 更新 更新

    屋内:杨絮刚刚躺下,又有些睡意,还没睡着,又听见敲门声,这下彻底火了,起身,拉门,“干什么啊你,垃圾收拾好了,我也...

  • 更新更新

  • 更新更新

    昨天没有更新,今天也懒懒的不想写了,确实我还是离不开三分钟热度啊,但是我真的希望自己能坚持下来,人生路上的迷惑事物...

  • 更新,更新,持续更新,不断更新

    手机系统更新了。在我睡着的时候。 手机上的app,也在不断的更新着。 大的小的,持续的更新,不断的进步。不断变得更...

  • 2021-04-14

    每天更新每天更新每天更新每天更新每天更新每天更新每天更新每天更新每天更新每天更新每天更新每天更新每天更新每天更新每...

  • 来不来得及

    忘了更新 忘了更新 忘了更新 忘了更新 忘了更新 忘了更新 忘了更新 忘了更新 忘了更新 忘了更新 忘了更新 忘了...

  • 今天

    没更新没更新没更新没关系没更新没更新没更新没关系没更新没更新没更新没关系没更新没更新没更新没关系没更新没更新没更新...

  • 今天没有更新

    今天不更新,今天不更新,今天不更新,今天不更新,今天不更新,今天不更新,今天不更新,今天不更新,今天不更新,今天不...

网友评论

      本文标题:gorm-V2-06-更新

      本文链接:https://www.haomeiwen.com/subject/segflrtx.html