在 Go 语言的 Web 开发中,GORM 是一个广泛使用的 ORM (Object-Relational Mapping) 框架。它提供了一种流畅的方式来处理数据库的交互,其中包括记录的更新操作。GORM中的更新操作主要是update、updates、save这几种
操作前的准备工作:声明模型,连接数据库
使用gorm对数据库中的数据进行修改,首先我们需要一个与表中字段、表名相对应的结构体,我们以一个User结构体来举例
声明模型
// User 定义了用户模型,对应数据库中的 user 表
type User struct {
Id int `gorm:"column:id" json:"id"`
UserName string `gorm:"column:userName" json:"userName"` // 用户昵称
UserPassword string `gorm:"column:userPassword;not null" json:"userPassword"` // 密码
UserEmail string `gorm:"column:userEmail" json:"userEmail"` //用户邮箱
UserProfile string `gorm:"column:userProfile" json:"userProfile"` // 用户简介
IsDelete int8 `gorm:"column:isDelete;default:0;not null" json:"isDelete"` // 是否删除}
// TableName 指定 User 模型对应的数据库表名
func (User) TableName() string {
return "user"
}
其中column指的是该数据库表中对应的列名,“user”是表名
连接数据库
func main() {
// 连接数据库
db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
if err != nil {
panic("failed to connect database")
}
// 创建一个用户
user := &User{
UserName: "John",
UserPassWord:"123456",
UserEmail:"123@234.com",
UserProfile:"一个用户~"
}
result := db.Create(user)
if result.Error != nil {
panic("failed to create user")
}
}
Save-- 保存所有列
Save 会保存所有的字段,即使字段是零值;保存是一个组合函数。 如果保存值不包含主键,它将执行 Create,否则它将执行 Update (包含所有字段)。
db.Save(&User{UserName: "John", UserPassWord:"123456",UserEmail:"123@234.com"}
/*等同于:INSERT INTO `users` (`userName`,`userPassword`,`userEmail`,`userProfile`,`isDelete`)
VALUES ("John","123456","123@234.com","",0)*/
Update – 更新单个列
当使用 Update 更新单列时,需要有一些条件,否则将会引起ErrMissingWhereClause 错误,当使用 Model 方法,并且它有主键值时,主键将会被用于构建条件,例如:
// 根据条件更新
db.Model(&User{}).Where("userName = ?", "JONE").Update("userPassword", "987654")
// UPDATE users SET userPassword='987654', WHERE userName =JONE;
// User 的 ID 是 `1`
db.Model(&user).Update("userName ", "JONE")
// UPDATE users SET userName ='JONE',WHERE id=1;
Update 方法返回了一个 gorm.DB 类型的结果,通过检查 Result.Error 和 Result.RowsAffected 属性,我们可以确定更新操作是否成功执行。
Updates --更新多个列
除了更新单个字段之外,我们还可以使用 Update 方法同时更新多个字段。这可以通过传递一个包含多个键值对的地图作为参数来实现。
Updates 方法支持 struct 和 map[string]interface{} 参数。当使用 struct 更新时,默认情况下GORM 只会更新非零值的字段
db.Save(&User{UserName: "John", UserPassWord:"123456",UserEmail:"123@234.com"}
/*等同于:INSERT INTO `users` (`userName`,`userPassword`,`userEmail`,`userProfile`,`isDelete`)
VALUES ("John","123456","123@234.com")*/
处理错误
这里插入一个在使用过程中遇到的一个小问题:
当我们使用Add()来向数据库添加数据时,如果插入的数据违反了唯一键约束,就会返回错误:
Duplicate entry
GORM官方网站对于这个错误的处理是使用ErrDuplicatedKey
但是通过测试发现这个并不能捕捉到违反唯一键约束的错误,通过修改发现可以使用如下的方法:
if err != nil {
if strings.Contains(err.Error(), "Duplicate") {
//处理违反唯一键约束错误
return
}
//处理其他错误
return
}
其他的错误例如ErrRecordNotFound也可以使用这种方式来捕捉