Go中处理数据库中NULL值的方法

如果你在Golang中处理过SQL,你就会知道处理NULL值并不容易。database/sql接口已经通过使用Gonil来支持NULL值,但语言的设计不允许将nil分配给stringint变量。在这篇文章中,我将告诉你一些方法。

1) 指针

Go中,如果原始变量不是一个指针,就不能赋值为nil。指针通常用于将共享数据传递给另一个函数,以使内存的使用更加有效,但我们也有另一个很好的理由来使用它:处理NULL值。

type User struct {
	id int64
	name *string
	age *int32
}
err := db.QueryRow("SELECT NULL, 2").Scan(&u.Name, &u.Age)

在这种情况下,我们可以将Name字段设置为其指针的nilsql.Scan()通过将给定的指针参数设置为nil来处理NULL值。json.Marshall()操作也支持在JSON格式中设置nil指针为null。但每次使用变量或结构字段作为指针时,你必须检查这些指针是否为空。如果u.Agenil,那么你引用它,程序将崩溃。

2) sql.Null*

sql包中定义了一些结构。它允许使用不同原始类型的变量,这些变量可以是null的。这些结构还实现了一个扫描器和一个值接口,允许在sql操作中使用。但它默认不处理JSON格式的数据,所以你必须自己实现。文档

type User struct {
	id int64
	name sql.NullString
	age sql.NullInt32
}
err := db.QueryRow("SELECT 'Ekin', NULL").Scan(&u.Name, &u.Age)

例如,我们看sql.NullString结构,它有两个字段,分别是StringValid。对于非NULL值,u.Name.Valid字段将等于trueu.Name.String等于 Ekin。否则,u.Name.Valid将为假,u.Name.String将为""。如果你的字段类型是NullString,首先你必须检查这个变量的Valid字段。如果是有效的,我们可以通过u.Name.String字段获得值。

3) github.com/guregu/null

这是第三种方法,来自Github的一个外部包,用于处理NULL值,与第二种方法非常相似。但它更容易创建nullable类型。它还支持JSONmarshall操作。文档

4) 使用COALESCE函数

COALESCE是大多数关系型数据库系统(SQLite、PostgreSQL、MySQL、SQL Server和Oracle)中的SQL函数。这个函数根据其给定的参数,尝试返回第一个非空值。文档

type User struct {
	id int64
	name string
	age int32
}
err := db.QueryRow("SELECT COALESCE(NULL, '')").Scan(&u.Name)

5) 不要使用NULL值

是的,这不是一个程序化的解决方案,但我们可以通过不使用NULL值来避免查询的NULL返回。通常情况下,NULL值来自于列的默认值,或者我们将值设置为NULL。所以,如果我们不使用NULL值,我们就不需要处理它。😎

但这并不意味着我们不应该使用NULL。它有时是必要的,有时不是。我建议你自己决定。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值