我正在编写一个基本程序,从数据库表中读取值并在表中打印。这张桌子上有一个古老的程序。行中的某些字段是可选的,当我试图将它们作为字符串读取时,会得到以下错误:
panic: sql: Scan error on column index 2: unsupported driver -> Scan pair: <nil> -> *string在阅读了其他类似问题的问题后,我想出了下面的代码来处理零值。该方法在实际应用中效果良好。我以纯文本和空字符串来获取值,而不是零值。
不过,我有两项关注:
我做错了吗?是否有一种更好/更干净/高效/熟能生巧的方法从数据库读取值?
我很难相信像Go这样的现代语言不会优雅地处理数据库。
提前感谢!
代码片段:
// DB read format
type udInfoBytes struct {
  id                     []byte
  state                  []byte
}
// output format
type udInfo struct {
  id                     string
  state                  string
}
func CToGoString(c []byte) string {
  n := -1
  for i, b := range c {
    if b == 0 {
      break
    }
    n = i
  }
  return string(c[:n+1])
}
func dbBytesToString(in udInfoBytes) udInfo {
  var out udInfo
  var s string
  var t int
  out.id = CToGoString(in.id)
  out.state = stateName(in.state)
  return out
}
func GetInfo(ud string) udInfo {
  db := getFileHandle()
  q := fmt.Sprintf("SELECT id,state FROM Mytable WHERE id='%s' ", ud)
  rows, err := db.Query(q)
  if err != nil {
    log.Fatal(err)
  }
  defer rows.Close()
  ret := udInfo{}
  r := udInfoBytes{}
  for rows.Next() {
    err := rows.Scan(&r.id, &r.state)
    if err != nil {
      log.Println(err)
    }
    break
  }
  err = rows.Err()
  if err != nil {
    log.Fatal(err)
  }
  ret = dbBytesToString(r)
  defer db.Close()
  return ret
}编辑:
我希望有这样的东西,在这里,我不必担心处理NULL,并自动将它们作为空字符串读取。
// output format
type udInfo struct {
  id                     string
  state                  string
}
func GetInfo(ud string) udInfo {
  db := getFileHandle()
  q := fmt.Sprintf("SELECT id,state FROM Mytable WHERE id='%s' ", ud)
  rows, err := db.Query(q)
  if err != nil {
    log.Fatal(err)
  }
  defer rows.Close()
  r := udInfo{}
  for rows.Next() {
    err := rows.Scan(&r.id, &r.state)
    if err != nil {
      log.Println(err)
    }
    break
  }
  err = rows.Err()
  if err != nil {
    log.Fatal(err)
  }
  defer db.Close()
  return r
}发布于 2020-08-31 19:44:20
处理这些空值的方法有两种:
使用sql.NullString
if value.Valid { 
   return value.String
} 使用*字符串
if value != nil {
   return *value
}https://stackoverflow.com/questions/28642838
复制相似问题