GoLong的学习之路(十七)基础工具之GORM(操作数据库)(更新Update)

本文详细介绍了如何在GORM中进行单列、多列和特定字段的更新操作,包括使用SQL表达式、根据子查询更新、Hook回调、防止全局更新以及处理返回数据。同时提到了Save方法的使用和注意事项。

书接上回,上回写道,GORM的查询和创建(插入数据),这回继续些增删改查的改和删的操作。

更新update

修改单个列

当使用Update更新单个列时,它需要有任何条件,否则会引发错误ErrMissingWhereClause,详情查看Block Global Updates了解详细信息。当使用Model方法并且它的值有一个主值时,主键将被用来构建条件。

根据条件修改

db.Model(&User{
   
   }).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE active=true;

当用户ID为111

// User's ID is `111`:
db.Model(&user).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111;

更新条件和模型值

db.Model(&user).Where("active = ?", true).Update("name", "hello")
// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;

修改多个列

Updates支持使用structmap[string]接口{}进行更新。

注意:
当使用struct进行更新时,默认情况下只更新非零字段

使用' struct '更新属性,将只更新非零字段

db.Model(&user).Updates(User{
   
   Name: "hello", Age: 18, Active: false})
// UPDATE users SET name='hello', age=18, updated_at = '2013-11-17 21:34:10' WHERE id = 111;

使用map来更新属性,或者使用Select来指定要更新的字段这种情况下

使用' map '更新属性

db.Model(&user).Updates(map[string]interface{
   
   }{
   
   "name": "hello", "age": 18, "active": false})
// UPDATE users SET name='hello', age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

修改选定字段

使用' map '更新字段 Select

db.Model(&user).Select("name").Updates(map[string]interface{
   
   }{
   
   "name": "hello", "age": 18, "active": false})
// UPDATE users SET name='hello' WHERE id=111;

使用' map '更新字段 Qmit

db.Model(&user).Omit("name").Updates(map[string]interface{
   
   }{
   
   "name": "hello", "age": 18, "active": false})
// UPDATE users SET age=18, active=false, updated_at='2013-11-17 21:34:10' WHERE id=111;

使用Struct 跟新字段

db.Model(&user).Select("Name", "Age").Updates(User{
   
   Name: "new_name", Age: 0})
// UPDATE users SET name='new_name', age=0 WHERE id=111;

使用Struct 更新所有字段包括非0字段

db.Model(&user).Select("*").Updates(User{
   
   Name: <
### 如何使用GORM在Go语言中执行更新操作 #### 使用`Update`方法单个字段更新 当需要更新记录中的某个特定字段时,可以调用模型实例上的 `Update` 方法并指定要修改的字段名称以及新值。此过程会触发一次数据库写入,并且如果存在 `UpdatedAt` 字段的话,则该时间戳会被自动刷新。 ```go db.Model(&product).Update("price", 200) ``` 上述代码片段展示了如何将名为 `product` 的对象的价格设置为新的数值,在这里假设有一个已经存在的产品实体被加载到了变量 `product` 中[^1]。 #### 批量更新多个字段 对于多列的同时更新,可以通过传递结构体给 `Updates` 函数来实现。需要注意的是,只有非零值才会生效;为了确保所有字段都能得到正确处理,建议采用指针类型的结构体作为参数。 ```go // 更新 multiple columns, will only update non-zero fields result := db.Model(&product).Updates(Product{Name: "New Product", Price: 300}) fmt.Println(result.RowsAffected) // 输出受影响行数 ``` 这段示例说明了怎样一次性变更多项属性——通过向 `Updates` 提供一个包含了待更正项的新结构体实例完成操作。 #### 条件性批量更新 有时可能希望基于某些条件来进行大规模的数据调整。这时可以在链式调用里加入 `.Where()` 子句以限定作用范围内的记录集: ```go db.Where("state = ?", "CA").Updates(map[string]interface{}{ "Price": 400, "UpdatedBy": "admin", }) ``` 这里的例子体现了针对状态码等于 `"CA"` 的那些条目实施价格上调及其他元数据维护的动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值