如何从Go中的Postgres获取NULL布尔值?

时间:2014-11-17 15:38:37

标签: postgresql go boolean

bool类型的零值为false。 Postgres支持未定义的BOOL类型,表示为NULL。当尝试从Go中的Postgres获取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。

2 个答案:

答案 0 :(得分:6)

请参阅标准库中的http://golang.org/pkg/database/sql/#NullBool

  

NullBool表示可能为null的bool。 NullBool实现了   扫描仪接口,因此它可以用作扫描目的地,类似于   NullString。

答案 1 :(得分:2)

我的偏好是使用指针:

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);
}