扫描错误:不支持扫描,存储driver.Value类型<nil>到类型*字符串

时间:2017-07-03 17:20:07

标签: mysql go

当我尝试从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)
}

我得到了

  

sql:列索引10上的扫描错误:不支持扫描,存储   driver.Value类型为* string

类型

当字段值为NULL时。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

使用sql.NullString

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

就个人而言,我讨厌这个解决方案,这就是为什么我规范化我的数据库以便没有NULL s。

要么改变

var result []Article

var result []sql.NullString

然后使用文档中的检查来获取这些结果并生成[]Article

或者在您的结构中,更改

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 :(得分:1)

您可以使用以下两种解决方案中的任何一种:-

  1. 在使用scan()之前,可以使用sql.NullString处理该字段。或
  2. 您可以将所有可能的NULL值替换为查询本身中所需的字符串,例如''

要实现第一种解决方案,请参阅@RayfenWindspear答案。 对于第二种解决方案,请更新查询,如下所示:-

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

对于MySQL ,如果表达式为NULL,请使用IFNULL()COALESCE()函数返回备用值:

对于SQL Server ,使用IFNULL()COALESCE()函数可获得相同的结果

MS Access 使用IsNull功能可获得相同的结果

对于Oracle ,使用NVL()函数可获得相同的结果

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