如何在Go中从Postgres获取一个空的布尔值?

3

布尔类型在Go语言中的零值是false。Postgres支持未定义的BOOL类型,表示为NULL。这导致当尝试从Postgres在Go中获取一个BOOL值时出现问题:

rows,err := db.Query("SELECT UNNEST('{TRUE,FALSE,NULL}'::BOOL[])");
if err != nil {
    log.Fatal(err)
}
for rows.Next() {
    var value bool
    if err := rows.Scan(&value); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Value: %t\n",value);
}

输出:

Value: true  
Value: false  
2014/11/17 09:34:26 sql: Scan error on column index 0: sql/driver: couldn't convert <nil> (<nil>) into type bool

这个问题最常见的解决方法是什么?我想到的两个解决方案都不太理想:
  1. 不使用 Go 的 bool 类型。相反,我可能会使用字符串,并进行自己的转换以解决 nil 的问题。
  2. 通过使用 COALESCE() 或其他方式,始终确保 Postgres 中的 BOOL 为 TRUE 或 FALSE。
3个回答

8

4

我的偏好是使用指针:

for rows.Next() {
    var value *bool

    if err := rows.Scan(&value); err != nil {
        log.Fatal(err)
    }

    if value == nil {
        // Handle nil
    }

    fmt.Printf("Value: %t\n", *value);
}

0

如果使用SQL + graphQL(gqlgen),我更喜欢使用指针。

为什么呢?

因为当我生成一个模式时,它将在输出上具有指针,这样就更容易连接到包含指针的相关结构体(用于处理数据库操作)。


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