使用标准数据库/sql Row.Scan()
时,我遇到了行中存在空值的问题。如果不考虑行中可能存在的空值,我可能会得到类似<nil> -> *string
的扫描错误。这在使用LEFT JOIN查询或缺少NO NULL列约束的弱定义表时很常见。
有一些sql.NullXXX
类型(例如sql.NullInt64)可用于扫描行中可能的空值,然后检查该值是否为.Valid
。但是,这些类型不实现JSON编组,需要更多的逻辑和编码。
为了解决这个问题,是在SQL查询中使用COALESCE()
列值更好,还是在golang代码中进行一些额外的编码更好?
4条答案
按热度按时间y53ybaqx1#
您可以使用sql包提供的类型的别名,如(NullInt64、NullString等...)。使用别名有两个好处,一是可以扫描空值并在golang结构中获取,二是可以在JSON中封送该结构。
请看示例代码:
请看一下这个article,它对在golang中处理空值以及如何在JSON中使用它非常有帮助。
rdlzhqv92#
作为一种选择,你可以实现与JSON封送器接口匹配的自定义数据类型。之后,你就可以使用常规标记封送你的结构了。
检查示例:
vq8itlhq3#
plicqrtu4#
我实现了这种方法,它允许您扫描行,其中nil值被扫描为零值,尽管您必须将rows.Scan(args...)替换为RowScan(rows,args...)。而且,这种实现仅支持string、int和bool。如果需要,您可以从sql.Nullxxx添加其他类型