Day07:GORM快速入门05 更新| 青训营

128 阅读4分钟

导读

本套笔记是学习完Gin框架之后的下一个阶段,通过Gin框架我们可以很方便的和前端进行交互,下一步就是和数据库进行交互,这就需要使用GORM。本套笔记就是带你快速上手GORM,学习完这个之后就可以完成大项目的开发了,后续还会进行大项目的讲解开发,制作不易,喜欢的就点个关注吧。

本套课程基于GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.进行讲解,是对这个的补充解释说明。

注意

代码详解大部分是注释的形式给出,请留意代码注释。

GORM介绍

GORM(Go Object Relational Mapping)是一个在 Go 语言中使用的优秀的 ORM(对象关系映射)库。它提供了简单且强大的 API,使开发人员能够轻松地与数据库进行交互

保存所有字段

要保存所有字段,可以使用 Save 方法。

save()

var user User 

// 使用 Save 方法将数据保存到数据库 
result := db.Save(&user)
db.Save(&User{Name: "jinzhu", Age: 100}) 

更新单个列

要在 GORM 中更新单个列,可以使用 UpdateColumn 方法。

// 假设你有一个名为 user 的结构体,并已经从数据库中查询得到
var user User

// 更新字段的值
user.Name = "New Name"

// 使用 UpdateColumn 方法更新数据库记录的单个列
result := db.Model(&user).UpdateColumn("name", user.Name)

完整代码

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 用户结构体
type User struct {
	ID   uint   `gorm:"primaryKey"`
	Name string `gorm:"column:name"`
	Age  int    `gorm:"column:age"`
}

func main() {
	// 连接数据库
	dsn := "user:password@tcp(localhost:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	

	// 自动迁移数据库表
	err = db.AutoMigrate(&User{})
	if err != nil {
		panic("Failed to migrate database")
	}

	// 查询用户
	var user User
	result := db.First(&user)
	
	// 更新字段的值
	user.Name = "New Name"
	
	// 使用 UpdateColumn 方法更新数据库记录的单个列
	db.Model(&user).UpdateColumn("name", user.Name)
	
}

我们首先连接到数据库,并使用 AutoMigrate 方法自动迁移数据库表以确保用户表存在。

然后,我们查询并获取要更新的用户。在这里,我们将用户的 Name 字段更新为新的值。

最后,我们使用 Model 方法指定要更新的模型对象,并使用 UpdateColumn 方法将更新后的值保存到数据库中的相应列

更新多个列

可以使用updatas

   package main

import (
   "fmt"
   "gorm.io/driver/mysql"
   "gorm.io/gorm"
)

// 用户结构体
type User struct {
   ID   uint   `gorm:"primaryKey"`
   Name string `gorm:"column:name"`
   Age  int    `gorm:"column:age"`
}

func main() {
   // 连接数据库
   dsn := "user:password@tcp(localhost:3306)/database? charset=utf8mb4&parseTime=True&loc=Local"
   db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})


   // 自动迁移数据库表
   err = db.AutoMigrate(&User{})
   

   // 查询用户
   var user User
   result := db.First(&user)
   

   // 更新多个字段的值
   updates := map[string]interface{}{
   	"name": "New Name",
   	"age":  30,
   }

   // 使用 Updates 方法更新数据库记录的多个列
   db.Model(&user).Updates(updates)
   
}
  1. 首先,我们通过 gorm.Open 方法连接到数据库,并使用提供的数据库连接信息和配置参数。
  2. 然后,我们使用 db.AutoMigrate 方法自动迁移数据库表,以确保 User 结构体对应的表存在于数据库中。
  3. 接下来,我们使用 db.First 方法查询并获取要更新的用户。将查询结果存储在 user 变量中。
  4. 我们使用一个 map 对象 updates 存储要更新的多个列和它们对应的新值。在这个示例中,我们更新了 Name 列为 "New Name",以及更新了 Age 列为 30。
  5. 最后,我们使用 db.Model(&user).Updates(updates) 方法将更新后的值保存到数据库中的相应列。这里的 &user 表示要更新的模型对象是 userUpdates(updates) 表示要更新的字段和对应的新值。

更新选定字段

// 更新选定的字段 
updates := map[string]interface{}{ "Name": "New Name", } 
// 使用 Updates 方法更新数据库记录的选定字段 
result = db.Model(&user).Updates(updates)

我们将 updates map 对象中只包含了要更新的 Name 字段和对应的值 "New Name"。

然后,我们使用 db.Model(&user).Updates(updates) 方法将更新保存到数据库中的选定字段。这里的 &user 表示要更新的模型对象是 userUpdates(updates) 表示要更新的字段和对应的新值。

批量更新

要实现批量更新多个记录的方法,你可以使用 Updates 方法并传递一个包含要更新字段和对应新值的 map 切片

package main

import (
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// 用户结构体
type User struct {
	ID   uint   `gorm:"primaryKey"`
	Name string `gorm:"column:name"`
	Age  int    `gorm:"column:age"`
}

func main() {
	// 连接数据库
	dsn := "user:password@tcp(localhost:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	

	// 自动迁移数据库表
	err = db.AutoMigrate(&User{})
	

	// 批量查询用户
	var users []User
	result := db.Find(&users)
	
   // 更新选定的字段
	updates := map[string]interface{}{
		"Name": "New Name",
		"Age":  30,
	}

	// 使用 Updates 方法更新数据库记录的选定字段
	result = db.Model(&User{}).Updates(updates)
        
        result.RowsAffected//更新的记录数

}

,我们首先使用 db.Find 查询多个用户,并将查询结果存储在 users 切片中。

然后,我们定义一个 updates map 对象,其中包含了要更新的字段和对应的新值。

最后,我们使用 db.Model(&User{}).Updates(updates) 方法将更新保存到数据库中。这里的 &User{} 表示要操作的是 User 模型对象,Updates(updates) 表示要更新的字段和对应的新值。