如何处理数据库的零返回值?

FlowRaja

我正在编写一个基本程序来从数据库表中读取值并在表中打印。桌子上有一个古老的程序。该行中的某些字段是可选的,当我尝试将它们读取为字符串时,出现以下错误:

panic: sql: Scan error on column index 2: unsupported driver -> Scan pair: <nil> -> *string

阅读有关类似问题的其他问题后,我想出了以下代码来处理nil值。该方法在实践中效果很好。我得到纯文本和空字符串中的值,而不是nil值。

但是,我有两个问题:

  1. 这看起来效率不高。我需要处理25个以上的字段,这意味着我将每个字段读取为字节并转换为字符串。函数调用和转换太多。两种处理数据的结构,依此类推...
  2. 该代码看起来很难看。它已经看起来像2个字段一样令人费解,当我转到25+时变得不可读

我做错了吗?是否有更好/更清洁/高效/惯用的golang方式从数据库读取值?

我发现很难相信像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
}
特米歇尔

有不同的类型来处理null值从数据库中,如来sql.NullBoolsql.NullFloat64等等。

例如:

 var s sql.NullString
 err := db.QueryRow("SELECT name FROM foo WHERE id=?", id).Scan(&s)
 ...
 if s.Valid {
    // use s.String
 } else {
    // NULL value
 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C#/ JSON如何处理从数据库查询返回的NULL值?

来自分类Dev

如何处理AsyncTask的返回值

来自分类Dev

如何处理可选参数+可选返回值

来自分类Dev

从管道读取:如何处理c中的返回值?

来自分类Dev

如何处理飞溅中的scrapy的多个返回值

来自分类Dev

如何处理“警告:忽略'系统'的返回值”,

来自分类Dev

如何处理main()函数的返回值?

来自分类Dev

PHP readfile()如何处理返回值

来自分类Dev

如何处理jQuery数据表中的数据库空值

来自分类Dev

PHP从数据库中选择并返回值

来自分类Dev

C#检查是否从数据库返回值

来自分类Dev

Linq查询未从数据库字段返回值

来自分类Dev

当前未从MYSQL数据库分配的返回值

来自分类Dev

Java数据库未返回值

来自分类Dev

如何从包含数据库查询的Node.js函数返回值

来自分类Dev

如何在jsonstore Worklight 6.2中以Json格式从数据库获取或返回值?

来自分类Dev

如何在Python中将返回值插入mysql数据库?

来自分类Dev

如何使用子查询的返回值名称创建数据库?

来自分类Dev

如何处理数据库架构中的用户权限?

来自分类Dev

如何处理用户选项和mysql数据库

来自分类Dev

如何处理外部插入流星数据库?

来自分类Dev

如何处理流星/蒙哥对数据库的更改?

来自分类Dev

数据库如何处理冗余值?

来自分类Dev

DataReader(DbCommand)如何处理数据库通信?

来自分类Dev

如何处理对MySQL数据库的异步调用

来自分类Dev

我该如何处理Coupon数据库设计?

来自分类Dev

如何处理流星/蒙哥对数据库的更改?

来自分类Dev

如何处理数据库架构中的用户权限?

来自分类Dev

如何处理用户选项和mysql数据库

Related 相关文章

热门标签

归档