GORM解决零值不被更新问题

问题

在这里插入图片描述

package main

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"os"
	"time"
)

type Product struct {
	gorm.Model
	Code  string
	Price uint
}

func main() {
	// 连接对应的数据库
	dsn := "root:root@tcp(192.168.193.128:3306)/grom_test?charset=utf8mb4&parseTime=True&loc=Local"
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
		logger.Config{
			SlowThreshold: time.Second,   // 慢 SQL 阈值
			LogLevel:      logger.Info, // 日志级别
			IgnoreRecordNotFoundError: true,   // 忽略ErrRecordNotFound(记录未找到)错误
			Colorful:      true,         // 使用用彩色打印
		},
	)

	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: newLogger})
	if err != nil {
		panic(err)
	}
	db.Create(&Product{Code: "DDD",Price: 20})
	db.Updates(&Product{Code: "",Price: 0})
}

日志:

INSERT INTO `products` (`created_at`,`updated_at`,`deleted_at`,`code`,`price`) VALUES ('2022-05-26 13:51:01.517','2022-05-26 13:51:01.517',NULL,'DDD',20)

UPDATE `products` SET `updated_at`='2022-05-26 13:52:01.06' WHERE `products`.`deleted_at` IS NULL

在这里插入图片描述

我们再执行修改操作时,将Code设置为"“将Price设置成0;但是再执行SQL时没有将这两个字段进行修改.表中的值还是原值.是因为这里用到的更新仅更新非零值字段;”"就是string的零值.0就是uint的零值;所以不做更新

解决方案

使用sql.NullXxx

将code的类型改为sql.NullString;price的类型sql.NullInt32

package main

import (
	"database/sql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"os"
	"time"
)

type Product struct {
	gorm.Model
	Code  sql.NullString
	Price sql.NullInt32
}

func main() {
	// 连接对应的数据库
	dsn := "root:root@tcp(192.168.193.128:3306)/grom_test?charset=utf8mb4&parseTime=True&loc=Local"
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
		logger.Config{
			SlowThreshold:             time.Second, // 慢 SQL 阈值
			LogLevel:                  logger.Info, // 日志级别
			IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound(记录未找到)错误
			Colorful:                  true,        // 使用用彩色打印
		},
	)

	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: newLogger})
	if err != nil {
		panic(err)
	}
	var p Product
	db.Model(&p).Where("code = ?","DDD").
		Updates(Product{Code: sql.NullString{String: "", Valid: true}, Price: sql.NullInt32{Int32: 0, Valid: true}})
}

日志:

UPDATE `products` SET `updated_at`='2022-05-26 14:28:51.882',`code`='',`price`=0 WHERE code = 'DDD' AND `products`.`deleted_at` IS NULL

如果需要更新非零值字段的话,就需要把类型设置为sql.NullString;常用类型只要是有零值的类型,再sql包下都有对零值的处理;

使用指针

package main

import (
	"database/sql"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"log"
	"os"
	"time"
)

type Product struct {
	gorm.Model
	Code  *string
	Price sql.NullInt32
}

func main() {
	// 连接对应的数据库
	dsn := "root:root@tcp(192.168.193.128:3306)/grom_test?charset=utf8mb4&parseTime=True&loc=Local"
	newLogger := logger.New(
		log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer(日志输出的目标,前缀和日志包含的内容——译者注)
		logger.Config{
			SlowThreshold:             time.Second, // 慢 SQL 阈值
			LogLevel:                  logger.Info, // 日志级别
			IgnoreRecordNotFoundError: true,        // 忽略ErrRecordNotFound(记录未找到)错误
			Colorful:                  true,        // 使用用彩色打印
		},
	)

	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: newLogger})
	if err != nil {
		panic(err)
	}
	var p Product
	code := ""
	db.Model(&p).Where("code = ?","DDD").
		Updates(Product{Code: &code, Price: sql.NullInt32{Int32: 0, Valid: true}})
}

日志:

UPDATE `products` SET `updated_at`='2022-05-26 15:28:31.906',`code`='',`price`=0 WHERE code = 'DDD' AND `products`.`deleted_at` IS NULL

使用指针同样可以对零值进行修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

.番茄炒蛋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值