扫描错误:不支持的扫描,将driver.Value类型<nil>存储到类型*string中。

25

当我尝试从mysql数据库中获取没有照片的文章时:

func ArticlesAllText() ([]Article, error) {
    var err error
    var result []Article
    err = database.SQL.Select(&result, "SELECT * FROM Article WHERE photo IS NULL")
    if err != nil {
        log.Println(err)
    }
    return result, standardizeError(err)
}

我遇到了以下问题:

在第10个字段上,SQL扫描出错:不支持的扫描,将driver.Value类型存储到*string类型中

当该字段值为NULL时。

我该如何解决这个问题?


1
个人而言,当主要接口语言为Go时,我不允许在我的数据库中使用null。我有意使数据库规范化以实现这一点。我意识到这并不适用于每个人,所以这只是一个建议。 - RayfenWindspear
2个回答

30

使用sql.NullString

https://godoc.org/database/sql#NullString

个人而言,我不喜欢这种解决方案,这就是为什么我对我的数据库进行规范化处理,以便没有NULL

要么更改

var result []Article


var result []sql.NullString

我不知道。请提供更具体的上下文或完整的句子以帮助我更好地理解并回答问题。
Photo *string

Photo sql.NullString

处理这个结构体而不是*string的烦恼。

感谢ATN,点击此处查看指南:https://medium.com/aubergine-solutions/how-i-handled-null-possible-values-from-database-rows-in-golang-521fb0ee267


1
那么你会如何重写上面的查询? - Karlom
@Karlom 查询语句是相同的,只需在传递给它以填充的 interface{} 中使用 sql.NullString 字段而不是 *string - RayfenWindspear
请提供代码。我无法按照您的指示操作。 - Karlom
1
更多细节请参见:https://medium.com/aubergine-solutions/how-i-handled-null-possible-values-from-database-rows-in-golang-521fb0ee267 - ATN
@ATN 谢谢你的回复,我会将它包含在答案中。虽然我个人仍然主张使用非空数据库,但我认识到它们在确定值是否被设置或零值是否实际上是真实值方面的有用性。 - RayfenWindspear
当编组JSON时,您会得到以下内容"updated_at": {"String": "","Valid": false},那么我该如何将其设置为null? - Nixon Kosgei

9
你可以使用以下两种解决方案之一:
  1. 在使用scan()之前使用 sql.NullString 来处理该字段。或
  2. 你可以在查询中替换所有可能的 NULL 值为所需的字符串,比如说' '

要实现第一个解决方案,请参考 @RayfenWindspear 的答案。 要实现第二个解决方案,请按照以下步骤更新查询:

SELECT colm1, colm2, COALESCE(photo, '') photo, colm4 FROM Article WHERE photo IS NULL

MySQL:使用IFNULL()COALESCE() 函数来在表达式为 NULL 时返回替代值:

SQL Server:使用IFNULL()COALESCE() 函数可得到相同的结果。

MS Access:使用IsNull 函数可得到相同的结果。

Oracle:使用NVL() 函数可得到相同的结果。

参考:https://www.w3schools.com/sql/sql_isnull.asp


2
是的,对于这种情况,coalesce 对我来说非常好用! - Eradicatore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接