gorm基础05--CRUD 接口-更新

gorm基础05--CRUD 接口-更新

介绍

上文 gorm基础04–CRUD 接口-查询 介绍了gorm 中常见查询方法,本文继续介绍gorm中常见的更新方法。具体包括 保存所有字段、更新单个列、更新多个列、更新选定字段、批量更新 等。

案例

updateAllFields(db) 保存所有字段
updateSingleField(db) 更新单个列
updateMultiFields(db) 更新多个列
updateSelectedFields(db) 更新选定字段
updateBatch(db) 批量更新
源码:

package main

import (
	"database/sql"
	"fmt"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
	"time"
)

type User struct {
	ID           uint
	Name         string
	Email        string
	Age          uint8
	Birthday     time.Time
	MemberNumber sql.NullString
	ActivatedAt  sql.NullTime
	CreatedAt    time.Time
	UpdatedAt    time.Time
	Active       bool
	Role         string
}

func getDb() *gorm.DB {
	db, err := gorm.Open(mysql.New(mysql.Config{
		DSN:                       "root:111111@tcp(127.0.0.1:3306)/gorm?charset=utf8&parseTime=True&loc=Local", // DSN data source name
		DefaultStringSize:         256,                                                                          // string 类型字段的默认长度
		DisableDatetimePrecision:  true,                                                                         // 禁用 datetime 精度,MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,                                                                         // 重命名索引时采用删除并新建的方式,MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,                                                                         // 用 `change` 重命名列,MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false,                                                                        // 根据当前 MySQL 版本自动配置
	}), &gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true}})
	fmt.Printf("getDb db=%v, err=%v\n", db, err)
	return db
}

func updateAllFields(db *gorm.DB) {
	var user User
	db.First(&user)
	user.Name = "jinzhu 001"
	user.Age = 100
	db.Save(&user)
}

func updateSingleField(db *gorm.DB) {
	var user User
	// 条件更新
	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;

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

	// 根据条件和 model 的值进行更新
	db.Model(&user).Where("active = ?", true).Update("age", 102)
	// UPDATE users SET age=100, updated_at='2013-11-17 21:34:10' WHERE id=111 AND active=true;
}

func updateMultiFields(db *gorm.DB) {
	var user User
	db.First(&user)
	// 根据 `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` 更新属性
	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;
}

func updateSelectedFields(db *gorm.DB) {
	var user1, user2, user3, user4, user5 User
	db.First(&user1)
	fmt.Println("user1=%v", user1)
	// 使用 Map 进行 Select
	// User's ID is `111`:
	db.Model(&user1).Select("name").Updates(map[string]interface{}{"id": user1.ID, "name": "hello01", "age": 18, "active": false})
	// UPDATE users SET name='hello' WHERE id=111;

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

	// 使用 Struct 进行 Select(会 select 零值的字段)
	db.Find(&user3, 3)
	fmt.Println("user3=%v", user3)
	db.Model(&user3).Select("Name", "Age").Updates(User{ID: user3.ID, Name: "hello03", Age: 0})
	// UPDATE users SET name='hello03', age=0 WHERE id=111;

	// Select 所有字段(查询包括零值字段的所有字段)
	db.Find(&user4, 4)
	fmt.Println("user4=%v", user4)
	db.Model(&user4).Select("*").Updates(User{ID: user4.ID, Name: "jinzhu04", Role: "admin", Age: 0, Birthday: time.Now(), CreatedAt: user4.CreatedAt})

	// Select 除 Role 外的所有字段(包括零值字段的所有字段)
	db.Find(&user5, 5)
	fmt.Println("user5=%v", user5)
	db.Model(&user5).Select("*").Omit("Role").Updates(User{ID: user5.ID, Name: "jinzhu05", Role: "admin", Age: 0, Birthday: time.Now(), CreatedAt: user5.CreatedAt})
}

func updateBatch(db *gorm.DB) {
	// 根据 struct 更新
	db.Model(User{}).Where("role = ?", "admin").Updates(User{Name: "hello", Age: 18})
	// UPDATE users SET name='hello', age=18 WHERE role = 'admin';

	// 根据 map 更新
	db.Table("user").Where("id IN ?", []int{10, 11}).Updates(map[string]interface{}{"name": "hello", "age": 18})
	// UPDATE users SET name='hello', age=18 WHERE id IN (10, 11);
}

func main() {
	db := getDb()
	db.AutoMigrate(User{})
	//updateAllFields(db)
	//updateSingleField(db)
	//updateMultiFields(db)
	//updateSelectedFields(db)
	updateBatch(db)
}

测试:
保存所有字段
在这里插入图片描述
更新单个列
在这里插入图片描述
更新多个列
在这里插入图片描述
更新选定字段
在这里插入图片描述
批量更新
在这里插入图片描述

说明

gorm官方文档 CRUD 接口-更新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昕光xg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值