美文网首页
GoFrame框架中的Update零值问题

GoFrame框架中的Update零值问题

作者: hezhangjian | 来源:发表于2021-08-19 12:09 被阅读0次

前几天,我的同事碰到了一个问题,是关于GoFrame 框架中数据字段的更新问题,数据中有一个status字段,他本来不想更新,但是却更新成了0。

相信看到描述,已经有经验丰富的专家可以猜到是数据部分更新导致的问题。

没错,就是因为数据库部分更新,把0这个值当成了需要更新的值刷新到了数据库中。

中间是复现问题的流程及代码细节,不感兴趣的可以直接拉到最后

复现问题

创建一个数据表

CREATE TABLE health_check (
    id VARCHAR (50) PRIMARY KEY,
    str_null VARCHAR (50) NULL,
    str_not_null VARCHAR (50) NOT NULL,
    int_null INT NULL,
    int_not_null INT NOT NULL
)

插入一条数据

数据库module的声明

type HealthCheck struct {
    Id         string  `orm:"id"`
    StrNull    *string `orm:"str_null"`
    StrNotNull string  `orm:"str_not_null"`
    IntNull    *int    `orm:"int_null"`
    IntNotNull int     `orm:"int_not_null"`
}

更新数据

这时,只想把IntNotNull字段更新成0

func UpdateHealth() error {
    table := g.DB().Schema(healthDb).Table(healthTable)
    healthCheck := &module.HealthCheck{}
    healthCheck.Id = config.HealthCheckId
    i := 6
    healthCheck.IntNull = &i
    table.Data(healthCheck).Where("id", config.HealthCheckId)
    result, err := table.Update()
    glog.Info(result)
    return err
}

执行完毕之后

除了我要更新的int_not_null字段,其他值都被修改了

这肯定不是我们想要的效果,我们只想更新一个字段。

这个时候GoFrame框架提供了OmitEmpty方法,可以忽略0值,也就是达到没传值不修改的效果,让我们加上OmitEmpty试试

table := g.DB().Schema(healthDb).Table(healthTable).OmitEmpty()
    healthCheck := &module.HealthCheck{}
    healthCheck.Id = config.HealthCheckId
    i := 0
    healthCheck.IntNotNull = i
    table.Data(healthCheck).Where("id", config.HealthCheckId)
    result, err := table.Update()
    glog.Info(result)
    return err

重新导入数据

操作update

可是什么都没有更新,原来OmitEmpty把数字0当做是0值,没有进行更新,那么要怎么写呢,答案是使用*int类型

让我们使用定位为*int类型的字段来更新一下int_not_null,代码如下

func UpdateHealth() error {
    table := g.DB().Schema(healthDb).Table(healthTable).OmitEmpty()
    healthCheck := &module.HealthCheck{}
    healthCheck.Id = config.HealthCheckId
    i := 0
    healthCheck.IntNull = &i
    table.Data(healthCheck).Where("id", config.HealthCheckId)
    result, err := table.Update()
    glog.Info(result)
    return err
}

再次操作Update

效果达成

总结

  • GoFrame的框架默认会对全量字段进行更新,无论你的字段有没有复制
  • OmitEmpty可以让框架跳过空值,但是int类型的0,也会跳过
  • 如果你还是想用OmitEmpty跳过空值的情况下,写入0,请使用*int类型

相关文章

  • GoFrame框架中的Update零值问题

    前几天,我的同事碰到了一个问题,是关于GoFrame 框架中数据字段的更新问题,数据中有一个status字段,他本...

  • update和insert...on duplicate key

    记录工作中根据sql返回值执行逻辑时遇到的问题。 update的返回值,如果update语句执行成功,则 affe...

  • Goframe框架细节

    一、OmitEmpty空值过滤 空值会影响于写入/更新操作方法,如Insert, Replace, Update,...

  • 八、SQL UPDATE 语句

    Update 语句 Update 语句用于修改表中的数据。 语法: UPDATE 表名称 SET 列名称 = 新值...

  • Goframe框架细节(二)

    一、模板引擎-模板配置 视图组件是GoFrame框架核心的组件之一,当然也支持非常方便的配置管理功能。 视图组件支...

  • goframe基础教程-快速入门【含视频】

    此教程主要对gofrmae框架做了基础介绍,希望可以让想入门的小伙伴可以快速的学习goframe框架。 教程仅有不...

  • Mybatis中Update返回值什么?

    问题 在Mybatis执行Update语句,会返回一个值,该值到底是受影响的条数还是其他什么? 测试 在数据库中插...

  • Golang应用开发框架 - GoFrame

    GF(Go Frame)是一款模块化、松耦合、生产级的Go应用开发框架。提供了常用的核心开发组件,如:缓存、日志、...

  • GoFrame 框架介绍及设计

    来自:GoCN链接:https://mp.weixin.qq.com/s/Q20M4CRATcQEzlD1rqKM...

  • Goframe框架对redis的支持

    一、Redis-配置管理 配置文件(推荐) 绝大部分情况下推荐使用g.Redis单例方式来操作redis。因此同样...

网友评论

      本文标题:GoFrame框架中的Update零值问题

      本文链接:https://www.haomeiwen.com/subject/muiobltx.html