go语言,ent库与gorm库,插入一条null值的time数据

情景介绍

使用go语言,我需要保存xxxTime的字段至数据库中,这个字段可能为空,也可能是一段时间。我采取的是统一先赋值为空,若有需要,则再进行插入(需要根据另一个字段判断是否插入)
在我的数据库中,使用的是DATETIME类型字段,代码中,采用的是time.Time 类型(这里有几个修改)。

使用Gorm库的实现

将xxxTime字段设置为sql.NullTime类型

在存储前,设置时

	res := Result{
        ...省略...
	xxxTime: sql.NullTime{
			Time:  time.Time{},
			Valid: false,
		},
        ...省略...

    }

在存储时

	if err := db.Table(Table1).Create(&res).Error; err != nil {
	log.Error("保存数据时出错:", err)
		return -1, err
	}

即可保存一条null值

在这里插入图片描述

之后采用进行插入即可


	currentTime := time.Now()
	tmpTime := currentTime.Add(time.Duration(msgInfo.RetryIntervalMinutes) * time.Minute)
	xxxTime = tmpTime.Format("2006-01-02 15:04:05")       


    err := db.Table(Table1).Where("id = ?", id).Update(xxxTime, xxxTime).Error

使用ENT库

使用ent库进行同样的操作,但是遇到了很多问题。

使用sql.NullTime格式

遭遇失败

首先是采取同样的方式:同样是设置格式为sql.NullTime(此处导入的是import "entgo.io/ent/dialect/sql",先前版本导入的是import "database/sql")
同样赋值操作是

	res := Result{
        xxxTime: sql.NullTime{
			Time:  time.Time{},
			Valid: false,
		}}

保存操作为

		SetxxxTime(res.xxxTime)

但是会在这句报错,报错内容为:无法将 ‘res.xxxTime’ (类型 sql.NullTime) 用作类型 time.Time

如果换为"database/sql"中的nulltime,依旧报错。无法将 'res.xxxTime' (类型 sql.NullTime) 用作类型 time.Time

毕竟生成的代码中,所接受的传参就是t time.Time格式而不是其他,故显然是无法sql.nullTime的的…


// SetxxxTime sets the "xxx" field.
func (dlsc *DeadLetterServerCreate) SetxxxTime(t time.Time) *DeadLetterServerCreate {
	dlsc.mutation.SetxxxTime(t)
	return dlsc
}

// SetNillablexxxTime sets the "xxx" field if the given value is not nil.
func (dlsc *DeadLetterServerCreate) SetNillablexxxTime(t *time.Time) *DeadLetterServerCreate {
	if t != nil {
		dlsc.SetxxxTime(*t)
	}
	return dlsc
}

为什么gorm可以?

而为什么gorm中可以呢?

func (db *DB) Create(value interface{}) (tx *DB) {
	if db.CreateBatchSize > 0 {
		return db.CreateInBatches(value, db.CreateBatchSize)
	}

	tx = db.getInstance()
	tx.Statement.Dest = value
	return tx.callbacks.Create().Execute(tx)
}

翻看gorm中Create的源码,发现他所接受的是interface{}接口,因此就可以了…

保存为指针类型

参考此篇文章,里面是gorm库下的解决方啊,他提供了两种方法——sql.nullTime和保存为指针。因此照猫画虎,尝试第二种方案——保存为指针。

修改相关代码如下:

	xxx *time.Time `db:"xxx"`


	res := Result{
       		xxx: nil,
		}

报错同上:毕竟是指定死类型的不是接口,所以肯定不对…
无法将 'res.xxx' (类型 *time.Time) 用作类型 time.Time

采用自动生成的 SetNillablexxx方法

在上面查看生成代码中,发现了这样一个函数

// SetNillablexxx sets the "xxx" field if the given value is not nil.
func (dlsc *DeadLetterServerCreate) SetNillablexxx(t *time.Time) *DeadLetterServerCreate {
	if t != nil {
		dlsc.Setxxx(*t)
	}
	return dlsc
}

他看起来就是实现了这样的功能,因此我们修改调用为这个。

SetNillableNextRetryTime(res.NextRetryTime).

运行后发现,可以正常保存。
在这里插入图片描述

完结,撒花!!

新的问题

这样可以保存NULL了,但我想真正保存时间时候,却无法保存了…

	testTime := time.Now()
	mh.Db.MainDB.UpdateOneID(id).SetNillableNextRetryTime(&testTime)

前面一直以为是格式化问题,修改了半天还是不行。。
后来我直接用这样的语句,结果都存不进去东西。

遂修改,增加错误输出:


	mh.Db.MainDB.UpdateOneID(id).SetNillableNextRetryTime(&nextRetryTime)

结果错误是nil,然后这时候,他就神奇的,成功了…!!
迷惑ing

参考资源

问如何告诉gorm将缺少的time.Time字段保存为NULL,而不是’0000-00-00’?

ent官方FAQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/275329.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PTS 3.0:可观测加持的下一代性能测试服务

作者:肖长军(穹谷) 大家好,我是来自阿里云云原生应用平台的肖长军,花名穹谷,我此次分享的主题是《可观测加持的下一代性能测试服务》。提到性能测试大家并不陌生,性能测试已成为评估系统能力、…

使用rsync构建镜像网站

实验环境 某公司在深圳、北京两地各放置了一台网站服务器,分别应对南北大区内不断增长的客户访问需求,两台服务器的网站文档必须保持一致,如图12.3所示,同步链路已通过VPN专用线路实现。 需求描述 > 服务器 A(北京…

SpringBoot多线程与任务调度总结

一、前言 多线程与任务调度是java开发中必须掌握的技能,在springBoot的开发中,多线程和任务调度变得越来越简单。实现方式可以通过实现ApplicationRunner接口,重新run的方法实现多线程。任务调度则可以使用Scheduled注解 二、使用示例 Slf…

linux如何清理磁盘,使得数据难以恢复

sda 是硬盘,sda1 和 sda2 是硬盘的两个分区。centos-root 是一个逻辑卷,挂载在根目录 /。 /dev/sda 是硬盘,/dev/sda1 和 /dev/sda2 是硬盘的两个分区。 [rootnode2 ~]# dd if/dev/urandom of/dev/sda bs4M这个命令将从 /dev/urandom 读取随…

【软件工程大题】数据流图_DFD图_精简易上手

数据流图(DFD)是一种图形化技术,它描绘信息流和数据从输人移动到输出的过程中所经受的变换。 首先给出一个数据流图样例 基本的四种图形 直角矩形:代表源点或终点,一般来说,是人,如例图的仓库管理员和采购员圆形(也可以画成圆角矩形):是处理,一般来说,是动作,是动词名词的形式…

<JavaEE> TCP 的通信机制(二) -- 连接管理(三次握手和四次挥手)

目录 TCP的通信机制的核心特性 三、连接管理 1)什么是连接管理? 2)“三次握手”建立连接 1> 什么是“三次握手”? 2> “三次握手”的核心作用是什么? 3)“四次挥手”断开连接 1> 什么是“…

vue动态路由,三级及以上路由,地址跳转,但是页面不显示

vue动态路由的时候,一级,二级路由都正常展示,但是三级,四级,五级等就只看到地址跳转了,但是页面并没有跳转,原因是共用了一个<router-view></router-view> import Layout from /layout import Vue from vue import Router from vue-router import db from /utils/…

工具系列:TensorFlow决策森林_(8)组合决策森林和神经网络模型

文章目录 介绍安装 TensorFlow Decision Forests导入库数据集模型结构模型训练评估决策森林下一步是什么&#xff1f; 介绍 欢迎来到TensorFlow Decision Forests&#xff08;TF-DF&#xff09;的模型组合教程。本教程将向您展示如何使用通用的预处理层和Keras函数式API将多个…

linux 网络工具(一)

linux 网络工具 1. nmcli命令1.1 介绍1.2 networking 网络控制1.3 connection 连接管理1.4 device 设备管理1.5 nmcli 返回状态码 2. ifcfg命令家族2.1 ifconfig2.2 route2.3 netstat 3. 静态路由CentosUbuntu - netplanUbuntu - network-manager 1. nmcli命令 1.1 介绍 RHEL…

使用机器学习进行语法错误检测/纠正

francescofranco_39234 一、说明 一般的学习&#xff0c;特别是深度学习&#xff0c;促进了自然语言处理。各种模型使人们能够执行机器翻译、文本摘要和情感分析——仅举几个用例。今天&#xff0c;我们将研究另一个流行的用途&#xff1a;我们将使用Gramformer构建一个用于机器…

安卓全球定位系统RTK测量仪 手持GPS北斗定位仪可用于国土电力

RTK&#xff0c;英文全名叫做Real-time kinematic&#xff0c;也就是实时动态。这是一个简称&#xff0c;全称是RTK&#xff08;Real-time kinematic&#xff0c;实时动态&#xff09;载波相位差分技术。 RTK定位是一种高精度的全球卫星导航技术&#xff0c;是实时运用技术&…

springcloud之通过openfeign优化服务调用方式

写在前面 源码 。 在前面的文章中我们实际上已经完成了优惠券模块微服务化的改造&#xff0c;但是其中还是有比较多可以优化和增强的地方&#xff0c;本文就先来对服务间的通信方式进行优化&#xff0c;具体就是使用openfeign来替换调原来的webclient。下面我们就开始吧&#…

低代码平台在金融银行中的应用场景

随着数字化转型的推进&#xff0c;商业银行越来越重视技术在业务发展中的作用。在这个背景下&#xff0c;白码低代码平台作为一种新型的开发方式&#xff0c;正逐渐受到广大商业银行的关注和应用。白码低代码平台能够快速构建各类应用程序&#xff0c;提高开发效率&#xff0c;…

网络攻防中应该掌握的进阶工具udp2raw,通过raw socket给UDP包加上TCP或ICMP header,进而绕过UDP屏蔽或QoS

网络攻防中应该掌握的进阶工具udp2raw,通过raw socket给UDP包加上TCP或ICMP header,进而绕过UDP屏蔽或QoS。 udp2raw tunnel,通过raw socket给UDP包加上TCP或ICMP header,进而绕过UDP屏蔽或QoS,或在UDP不稳定的环境下提升稳定性。可以有效防止在使用kcptun或者finalspeed的…

TiDB 7.5 LTS 发版丨提升规模化场景下关键应用的稳定性和成本的灵活性

互联网时代&#xff0c;数据的迅猛增长给数据库带来了可扩展性的挑战&#xff0c;Gen AI 带来的数据暴增更加剧了这种挑战。传统的数据分片已经不能承载新时代数据暴增的需求&#xff0c;更简单且具有前瞻性的方法则是采用原生分布式数据库来解决扩展性问题。在这种规模化场景的…

MYSQL一一外键约束

概念&#xff1a;外键用来让两张表的数据之间建立联系&#xff0c;从而保证数据的一致性和完整性 建立外键&#xff1a; ①这是在建立表的时候建立外键的方法 ②这是在建立完表之后建立外键的方法&#xff1a; 删除外键&#xff1a; 现在有一张员工表&#xff08;emp&#xf…

Linux基本指令(二)

目录 &#x1f4d5;前言 &#x1f4d5;echo 输出重定向&#xff08;>&#xff09; 追加重定向(>>) 输入重定向&#xff08;<&#xff09; &#x1f4d5;more &#x1f4d5;less &#x1f4d5;head &#x1f4d5;tail 查看大文本的中间部分 &#x1f4d5…

Java 8 中的 Stream 轻松遍历树形结构!

可能平常会遇到一些需求&#xff0c;比如构建菜单&#xff0c;构建树形结构&#xff0c;数据库一般就使用父id来表示&#xff0c;为了降低数据库的查询压力&#xff0c;我们可以使用Java8中的Stream流一次性把数据查出来&#xff0c;然后通过流式处理&#xff0c;我们一起来看看…

深入ArkUI:深入实战组件text和text input

文章目录 Text组件介绍Text组件的属性方法Text:文本显示组件4.3TextInput组件实战案例:图片宽度控制页面本文总结要点回顾在今天的课程中,我们将深入学习ArkUI提供的基础组件,着重探讨text和text input两个组件。 Text组件介绍 Text组件是一个用于显示文本的组件,其主要作…

自动化运维平台Spug本地部署结合内网穿透实现远程访问

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件…