【问题标题】:Scan error: unsupported Scan, storing driver.Value type <nil> into type *string扫描错误:不支持扫描,存储驱动程序。值类型 <nil> 到类型 *string
【发布时间】:2017-12-07 01:04:21
【问题描述】:

当我尝试从 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时。

我该如何解决这个问题?

【问题讨论】:

  • 当主要接口语言是 Go 时,我个人不允许在我的数据库中使用空值。我有目的地对数据库进行规范化,以使这是可能的。我知道这并不适用于所有人,所以这只是一个建议。

标签: mysql go


【解决方案1】:

使用sql.NullString

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

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

要么改变

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

【讨论】:

  • 那么你将如何重写上面的查询?
  • @Karlom 查询是一样的,你只需在传递给它的interface{} 中使用sql.NullString 字段而不是*string 来填充。
  • 请提供代码。我无法按照您的指示进行操作。
  • @ATN 谢谢你,我会把它包括在答案中,虽然我个人仍然提倡非空数据库,但我意识到它们在确定是否设置了值或零值方面很有用实际上是真正的价值。
【解决方案2】:

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

  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

【讨论】:

  • 是的,coalesce 对我来说非常适合这种情况!
猜你喜欢
  • 2019-07-05
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多