2014-11-17 25 views
1

bool类型的Go的零值为false。 Postgres支持未定义的BOOL类型,表示为NULL。试图去获取从Postgres的一个布尔值时,这会导致问题:如何在Go中从Postgres获取NULL布尔值?

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()或其他方式始终确保BOOLs在TRACEGRES是TRUE或FALSE。

回答

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