Go 查询数据库 Scan Null 字段报错解决办法
Go 语言基本类型都有默认值,比如整型,长整型,浮点型,字符串等等,都会有自己唯一的默认值 0,空字符串"",而不是nil, 这是它自身的特征,因为这个原因,Go 操作数据库,返回结果扫描填充结构体的时候,往往差强人意。当数据库字段是null值的时候,Go scan 数据填充结构体就出错了。
遇到这种情况,部分用户只能使用 sql.Null*** 类型来定义结构体,这个方式可以解决问题,但使用起来也是有点小麻烦, sql.Null*** 是复合类型的,它由 valid 是否有效值和实际值组成,取值的时候,为了避免错误往往需要判断是否有效,再取值,另外我们自定义的结构体,使用 sql.Null*** 多了,不仅取值如上所说的繁琐,还改变了结构体的本来的定义,有洁癖症的人,那受得了这些!
为了更方便的使用 Go 操作数据库,本人暂时没有好的办法,只能用一个比较土的办法:那就是从数据库入手(当然,这个问题绝对不是数据库造成的,众多数据库有他们的标准,语言层面如果不按照标准来,自然需要折腾),数据定义字段的时候,尽力给对应字段默认值,而不是给 null 值, 比如 整型 默认值 0,字符串默认值 '' 等等,这样就很大程度上解决了 Go 自身的问题了,这样做肯定不是尽善尽美的,想想也能明白,但这也是没有更好办法的办法了。
上面说这个方案并不是尽善尽美的,一、是遇到遗留的老项目,数据库并不是全部指定了默认值;二、如果是新项目,那也需要费点工夫,给字段指定默认值,不过这样也不错,让数据库更健壮一些。对于第一种情况,解决办法,还是花点工夫,把数据库每个必要的字段指定默认值,或者在 SQL 语句上使用 IFNULL 函数(MySQL 适用)。
2023年补充:如果确定数据库某字段可能出现 null 值,还有另一种方案,就是定义 Go 结构体 struct 的时候,给指针类型即可,例如:
type Foo struct { name *string // 直接给指针类型 gender *int // 直接给指针类型 }
使用结构体的时候,同样稍微麻烦一些,需要转换一下。
哇~~~ 竟然还没有评论!