GO语言程序查询数据库字段为空遇到的几个问题总结

如果字段值可能为空,那么从表里面读取数据的时候程序使用的变量类型应该使用 sql.NullXXX 类型,比如下面的日期类型:

开始的时候,deleteAt 使用的也是 time.Time类型。

这里读取数据都没有问题,但是发现当数据库日期类型字段为NULL的时候,日期类型变量读取到的是0000年的默认日期值,如果稍后再用这个默认值插入数据库,会出现下面的错误:

要解决这个问题的办法,就不能使用日期类型变量的默认值插入数据库,可以定义一个引用类型的变量,比如下面的代码,在上面Scan之后将读取出来的变量值赋值给一个结构对象。当然前提得定义变量为sql.NullXXX类型,比如下面代码中的 deleteAt变量:

这样如果数据库字段值为空的话,deleteAt.Valid为假,那么 recipe.DeleteAt 字段就是空了(nil),下面看下 RecipeDO 结构体的定义:

以后插入数据的时候,判断下结构体字段 DeleteAt是否为空,写不同的插入代码即可,如下示例:

当然也可以在上面的代码中Exec方法的第二个参数定义一个 sql.NullTime类型,就不用写上面的分支代码了。

PS:

GO语言程序查询数据处理空值的方式还是比较简陋的,容易掉坑里面去。要避免这个问题,最简单的办法还是在建表的时候,给所有字段都设置默认值。当然有时候字段值为NULL有特殊业务含义的话,上面的解决过程是绕不开了。

彩蛋:

上面示例中 RecipeDO 结构体的Content字段是一个复杂结构,数据库对应的表的Content字段是一个json类型,这个字段插入数据库之前必须先Json序列化,补上序列化它们的代码:

同样,从数据库读取这个字段,也要反序列化处理一下:

参考链接:

https://blog.csdn.net/weixin_30940057/article/details/113566387?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242

https://blog.csdn.net/leonpengweicn/article/details/51192557

https://www.jb51.net/article/202690.htm

Original: https://www.cnblogs.com/bluedoctor/p/15401638.html
Author: 深蓝医生
Title: GO语言程序查询数据库字段为空遇到的几个问题总结

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/516560/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球