GORM更新操作(Save、Update、Updates)

在 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也可以使用这种方式来捕捉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值