使用 Postgres 和 Mysql 的 database/sql 包和驱动程序,我想实现以下目标。我希望能够选择一行并知道有零行、一行或多行。QueryRow 函数没有实现这一点,因为据我所知,无论是否有超过一行,它都会返回一行而不会出错。对于我的情况,不止一行可能是一个错误,我想知道它。我想创建一个通用函数来做到这一点。
我查看了创建一个使用 Query 函数的函数,但如果有多行,我不知道如何返回第一行。我想返回多行的事实,但我也想返回第一行。要确定有多行,我必须执行 Next,它会覆盖第一行。显然我可以在不创建通用函数的情况下实现这一点,但我想要一个函数来做到这一点,因为我需要在很多地方这样做
。有人可以向我解释如何实现这一点。IE。在成功完成 Next 或 Next 不返回任何内容时从函数返回第一行。
问问题
285 次
1 回答
1
我同时使用database/sql
&MySQLDriver
来实现这一点。您可以MySQLDriver
在https://github.com/go-sql-driver/下载。
我自己编写了execQuery
函数来从数据库中获取一行或多行。它基于 MySQL,但我认为它也可以用于具有类似实现的 Postgres。
假设您有一个名为 的数据库表test
,并且有名为id
, name
,的行age
。
代码:
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()
遍历每一行。我想这就是你问的。
如果您真的想经常知道行数,那么使用缓存机制memcacheDB
或Redis
自己实现一个简单的计数器可以帮助您解决问题。
于 2013-04-24T04:13:19.087 回答