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