06-更新数据
1.01-包引用和引用顺序2.02-运算符号、标识符、注释、关键字3.03-变量和作用域4.02-常量(const)5.03-数组(array)6.04-切片(slice)7.05-map8.06-指针(pointer)9.07-通道(channel)10.08-结构体(struct)11.01-if语句12.02-for循环13.04-select语句14.03-switch语句15.make()、new()16.copy(切片间复制)17.append(增加切片成员)18.delete(删除map的成员)19.panic&recover20.03-匿名函数和闭包21.01-函数简单使用22.02-形参和实参23.04-递归函数24.05-方法25.06-接口(interface)26.01-并发27.02-携程通讯28.03-携程同步29.01-连接和建表30.02-创建数据31.03-基本查询32.04-高级查询33.05-初始化
34.06-更新数据
35.07-删除数据36.08 事务37.根据操作系统程序自动选择不同常量38.golang字串的base64编码解码39.golang数据类型转换40.golang 时间/时间戳的获取和转换目录
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具