关于go语言数据库存储和显示null值的问题困扰了我很久,并且也和群友讨论过这个问题,但是都没有得到相对满意和全面的答案。最近翻墙找了几篇相对详细和权威的文章,分享给大家,希望和大家一起进步,go go go!
文章一:Go语言:解决数据库中null值的问题(转载国人文章)
文章二:How I handled possible null values from database rows in Golang?(需科学上网)
文章三:Working effectively with database nulls(试验过不需要科学上网)
Github:有没有专门的null值函数库?
https://github.com/guregu/null介绍
import "gopkg.in/guregu/null.v3"
null是一个具有合理选项的库,用于处理可空的SQL和JSON值
有两个包: null
及其子包zero
。
null
类型仅在null输入时被视为null,并且JSON将编码为null
。 如果您需要零并且null被视为单独的值,请使用这些值。
zero
中的类型在Go中被视为零值:空字符串输入将生成空零zero.String
,并且空字符串将JSON编码为""
。 这些类型的零值将被视为对SQL无效。 如果你需要零和null处理相同,使用这些。
所有类型都实现了sql.Scanner
和driver.Valuer
,因此您可以使用此库代替sql.NullXXX
。 所有类型还实现: encoding.TextMarshaler
, encoding.TextUnmarshaler
, json.Marshaler
和json.Unmarshaler
。
null包
import "gopkg.in/guregu/null.v3"
null.String
可以为空的字符串。
如果SQL源数据为空,则Marshals为JSON null。 零(空白)输入不会产生空字符串。 可以从sql.NullString
JSON输入或字符串输入解sql.NullString
。
null.Int
可以为null的int64。
如果SQL源数据为空,则Marshals为JSON null。 零输入不会产生null Int。 可以从sql.NullInt64
JSON输入解sql.NullInt64
。
null.Float
可空浮动64。
如果SQL源数据为空,则Marshals为JSON null。 零输入不会产生null Float。 可以从sql.NullFloat64
JSON输入解sql.NullFloat64
。
null.Bool
可空的布尔。
如果SQL源数据为空,则Marshals为JSON null。 虚假输入不会产生null Bool。 可以从sql.NullBool
JSON输入解sql.NullBool
。
null.Time
如果SQL源数据为空,则Marshals为JSON null。 使用time.Time
的封送者。 可以从pq.NullTime
和类似的JSON输入解pq.NullTime
。
零包装
import "gopkg.in/guregu/null.v3/zero"
zero.String
可以为空的字符串。
如果为null,将Marshal编排为空字符串。 空字符串输入生成空字符串。 空值和零值被认为是等价的。 可以从sql.NullString
JSON输入解sql.NullString
。
zero.Int
可以为null的int64。
如果为null,将Marshal编排为0。 0产生一个空Int。 空值和零值被认为是等价的。 可以从sql.NullInt64
JSON输入解sql.NullInt64
。
zero.Float
可空浮动64。
如果为null,将Marshal编排为0。 0.0产生一个null Float。 空值和零值被认为是等价的。 可以从sql.NullFloat64
JSON输入解sql.NullFloat64
。
zero.Bool
可空的布尔。
如果为null,将Marshal编排为false。 false
产生一个null Float。 空值和零值被认为是等价的。 可以从sql.NullBool
JSON输入解sql.NullBool
。
zero.Time
如果为null,将Marshal编排为零时间。 使用time.Time
的封送者。 可以从pq.NullTime
和类似的JSON输入解pq.NullTime
。
错误
json
的",omitempty"
结构标记现在无法正常工作。 它永远不会省略null或空String。 这可能最终会得到解决 。