Go的 boolean 类型的零值为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

解决这个问题的最惯用的方法是什么?我想象的两种解决方案都不是很吸引人:
  • 不要使用Go的bool类型。相反,我可能会使用一个字符串,并进行自己的转换,该转换占nil
  • 通过使用COALESCE()或其他方法,始终确保Postgres中的 boolean 值为TRUE或FALSE。
  • 最佳答案

    我的偏好是使用指针:

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

    关于postgresql - 如何在Go中从Postgres获取NULL boolean 值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26976251/

    10-15 17:38