古老的榕树

Go 查询数据库 Scan Null 字段报错解决办法

发表 2016-12-25 10:44 阅读(2411) 评论(0) 赞(1)
Go 语言基本类型都有默认值,比如整型,长整型,浮点型,字符串等等,都会有自己唯一的默认值 0,空字符串"",而不是nil, 这是它自身的特征,因为这个原因,Go 操作数据库,返回结果扫描填充结构体的时候,往往差强人意。当数据库字段是null值的时候,Go scan 数据填充结构体就出错了。

遇到这种情况,部分用户只能使用 sql.Null*** 类型来定义结构体,这个方式可以解决问题,但使用起来也是有点小麻烦, sql.Null***  是复合类型的,它由 valid 是否有效值和实际值组成,取值的时候,为了避免错误往往需要判断是否有效,再取值,另外我们自定义的结构体,使用 sql.Null*** 多了,不仅取值如上所说的繁琐,还改变了结构体的本来的定义,有洁癖症的人,那受得了这些!

为了更方便的使用 Go 操作数据库,本人暂时没有好的办法,只能用一个比较土的办法:那就是从数据库入手(当然,这个问题绝对不是数据库造成的,众多数据库有他们的标准,语言层面如果不按照标准来,自然需要折腾),数据定义字段的时候,尽力给对应字段默认值,而不是给 null 值, 比如 整型 默认值 0,字符串默认值 '' 等等,这样就很大程度上解决了 Go 自身的问题了,这样做肯定不是尽善尽美的,想想也能明白,但这也是没有更好办法的办法了。


上面说这个方案并不是尽善尽美的,一、是遇到遗留的老项目,数据库并不是全部指定了默认值;二、如果是新项目,那也需要费点工夫,给字段指定默认值,不过这样也不错,让数据库更健壮一些。对于第一种情况,解决办法,还是花点工夫,把数据库每个必要的字段指定默认值,或者在 SQL 语句上使用 IFNULL 函数(MySQL 适用)。

Donate

如果文章对您有帮助,请使用手机支付宝扫描二维码,捐赠X元,作者离不开读者的支持!

0 条网友评论

哇~~~ 竟然还没有评论!

称呼*
邮箱*
内容*
验证码*
验证码 看不清换张