Sql Select - 返回的总行数

标签 sql go

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

我查看了创建一个使用查询函数的函数,但我不知道如果有多行则如何返回第一行。我想返回不止一行的事实,但我也想返回第一行。要确定有多行,我必须执行下一步,这会覆盖第一行。显然我可以在不创建通用函数的情况下实现这一点,但我想要一个函数来做到这一点,因为我需要在很多地方做到这一点

有人可以向我解释如何实现这一点。 IE。在 Next 成功完成或 Next 未返回任何内容时从函数返回第一行。

最佳答案

我同时使用 database/sqlMySQLDriver 来实现这一点。您可以在 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 等缓存机制,或者自己实现一个简单的计数器可以帮助您解决问题。

关于Sql Select - 返回的总行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16170666/

相关文章:

sql - 数组内的大括号 - postgresql

sql - 如何创建一个新字段来与 SELECT 字段一起显示?

http - 从外部 Go 中间件控制 HTTP header

go - 如何处理 NewCB​​CDecrypter 示例中的无效 key ?

python - 如何在 Go 中进行简单的继承

MySQL Workbench 中显示的连接应该读取 “Local instance MySQL57” 还是 “MySQL57”?

mysql - 如何在MySQL中获取每个系列的最后一集?

sql - 在 SQL 编码中可以在 TRIGGER 中使用 DEFERRABLE 吗? DEFERRABLE 是如何工作的?

go - 逐步计算

postgresql - 在gorm中获取结构中的嵌套对象