This repository has been archived on 2022-04-14. You can view files and clone it, but cannot push or open issues or pull requests.
manual-zh-CN/chapter-06
2020-10-20 12:48:03 +08:00
..
1.lock.md 更新Update 2020-10-20 12:48:03 +08:00
2.updated.md 更新Update 2020-10-20 12:48:03 +08:00
README.md 更新Update 2020-10-20 12:48:03 +08:00

更新数据

更新数据使用Update方法Update方法的第一个参数为需要更新的内容可以为一个结构体指针或者一个Map[string]interface{}类型。当传入的为结构体指针时只有非空和0的field才会被作为更新的字段。当传入的为Map类型时key为数据库Column的名字value为要更新的内容。

Update方法将返回两个参数,第一个为 更新的记录数,需要注意的是 SQLITE 数据库返回的是根据更新条件查询的记录数而不是真正受更新的记录数。

user := new(User)
user.Name = "myname"
affected, err := engine.ID(id).Update(user)

这里需要注意Update会自动从user结构体中提取非0和非nil得值作为需要更新的内容因此如果需要更新一个值为0则此种方法将无法实现因此有两种选择

  • 1.通过添加Cols函数指定需要更新结构体中的哪些值未指定的将不更新指定了的即使为0也会更新。
affected, err := engine.ID(id).Cols("age").Update(&user)
  • 2.通过传入map[string]interface{}来进行更新但这时需要额外指定更新到哪个表因为通过map是无法自动检测更新哪个表的。
affected, err := engine.Table(new(User)).ID(id).Update(map[string]interface{}{"age":0})

有时候希望能够指定必须更新某些字段,而其它字段根据值的情况自动判断,可以使用 MustCols 来组合 Update 使用。

affected, err := engine.ID(id).MustCols("age").Update(&user)

另外,如果需要更新所有的字段,可以使用 AllCols()

affected, err := engine.ID(id).AllCols(").Update(&user)