【问题标题】:How can I fetch a NULL boolean from Postgres in Go?如何从 Go 中的 Postgres 获取 NULL 布尔值?
【发布时间】:2014-11-17 15:38:36
【问题描述】:

Go 对于 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() 或其他方式确保 BOOL 在 Postgres 中为 TRUE 或 FALSE。

【问题讨论】:

    标签: postgresql go boolean


    【解决方案1】:

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

    NullBool 表示一个可能为空的布尔值。 NullBool 实现 扫描仪界面,因此它可以用作扫描目标,类似于 空字符串。

    【讨论】:

      【解决方案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);
      }
      

      【讨论】:

        【解决方案3】:

        如果使用 SQL + graphQL (gqlgen),我的偏好也是使用指针。

        为什么?

        因为当我生成一个模式时,它会在输出上有指针,这很容易与包含指针(处理 DB 操作)的相关结构连接。

        【讨论】:

          猜你喜欢
          • 2015-11-12
          • 1970-01-01
          • 2014-02-12
          • 2019-12-30
          • 1970-01-01
          • 2016-07-15
          • 2011-10-26
          • 1970-01-01
          • 2022-01-07
          相关资源
          最近更新 更多