扫描错误:不支持的扫描,存储驱动程序。将值类型<nil>转换为* string类型

Kar*_*lom 7 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)
}
Run Code Online (Sandbox Code Playgroud)

我懂了

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

字段值为时NULL

我怎样才能解决这个问题?

Rah*_*tal 9

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

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

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

SELECT colm1, colm2, COALESCE(photo, '') photo, colm4 FROM Article WHERE photo IS NULL
Run Code Online (Sandbox Code Playgroud)

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

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

MS Access使用IsNull函数获得相同的结果

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

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

  • 是的,合并对我来说在这样的时候非常有用! (2认同)

Ray*_*ear 8

使用sql.NullString

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

我个人讨厌这种解决方案,这就是为什么我对数据库进行规范化以使没有NULLs的原因。

要么改变

var result []Article
Run Code Online (Sandbox Code Playgroud)

var result []sql.NullString
Run Code Online (Sandbox Code Playgroud)

然后获取这些结果,并[]Article使用文档中的检查进行检查。

或者在您的结构中,更改

Photo *string
Run Code Online (Sandbox Code Playgroud)

Photo sql.NullString
Run Code Online (Sandbox Code Playgroud)

并处理它作为结构而不是结构的烦恼 *string

感谢ATN,请参阅此处获取指南https://medium.com/aubergine-solutions/how-i-handled-null-possible-values-from-database-rows-in-golang-521fb0ee267