Sql Select - 返回的总行数

时间:2013-04-23 13:29:59

标签: sql go

使用Postgres和Mysql的数据库/ sql包和驱动程序我想实现以下目的。我希望能够选择一行并知道有零行,一行或多行。 QueryRow函数没有实现这一点,因为据我所知,它将返回一行而不会出错,无论是否有多行。对于我的情况,多行可能是一个错误,我想知道它。我想创建一个通用函数来执行此操作。

我查看了创建一个使用Query函数的函数,但是如果有多行,我不知道如何返回第一行。我想返回有多行的事实,但我也想返回第一行。要确定有多行,我必须执行Next,并覆盖第一行。显然我可以在不创建一般功能的情况下实现这一目标,但我想要一个功能来完成它因为我需要在很多地方做这件事

有人可以向我解释如何实现这一点。 IE浏览器。要在成功完成Next后返回函数的第一行,或者Next返回任何内容。

1 个答案:

答案 0 :(得分:1)

我正在使用database/sql和& MySQLDriver实现这一目标。您可以在https://github.com/go-sql-driver/下载MySQLDriver

我自己写了execQuery函数来从数据库中获取一行或多行。它基于MySQL,但我认为它也可以用于Postgres类似的工具。

假设您有一个名为test的数据库表,并且包含名为idnameage的行。

代码:

var db *sql.DB // it should be initialized by "sql.Open()"

func execQuery(SQL string, args ...interface{}) (rows *sql.Rows, is_succeed bool) {
  rows, err := db.Query(SQL, args...)
  var ret bool
  if err == nil && rows != nil { // if DB query error rows will be nil, it will return false
    ret = true
  } else {
    ret = false
  }

  return rows, ret
}

用法:

var name, age string
rows, is_succeed = execQuery("SELECT `name`, `age` FROM `test` WHERE `id` = ?", "123")
if !is_succeed {
  // error
  return 
}
for rows.Next() { // if have zero result rows, this for route won't execute
  err := rows.Scan(&name, &age)
  // check if has error & do something
}

如果你想知道返回了多少行,只需在for路由中添加一个计数器,使用SQL也可以实现这一点。

sql.Rows喜欢列表结构,第一行返回行的rows *sql.Rows点。使用rows.Next()遍历每一行。我认为这就是你所问的。

如果你真的想知道行数非常,使用像memcacheDBRedis这样的缓存机制,或者只是自己实现一个简单的计数器可以帮助你解决问题