2013-04-23 124 views
2

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

我看着创建一个使用查询函数的函数,但我不知道如何返回第一行,如果有多个行。我想返回有多行的事实,但我也想返回第一行。要确定有多行,我必须执行Next,并覆盖第一行。很显然,我可以在不创建通用功能的情况下实现此功能,但是我想要一个功能来实现这一功能,因为我需要在多个位置执行此操作。

有人请向我解释如何实现此目的。 IE浏览器。当一个成功的Next完成或Next没有返回任何东西时,从函数返回第一行。Sql Select - 返回的总行数

回答

1

我正在使用database/sql & MySQLDriver来实现此目的。您可以在https://github.com/go-sql-driver/下载MySQLDriver

我自己写了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()来遍历每一行。我想这就是你问的。

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

+0

感谢您的回答。我想要实现的基本上是知道有多少行返回。 MySql有一种实现方式(它不适用于我),但是Postgres显然没有。我的第二选择是知道是否有多行。如果还有第二行,则第一行将被“下一个”覆盖,我猜测第二行。总之,我想知道的是以下所有内容。是否有一排?b。是否有多行? C。我不管第一排。 d。理想情况下,我想知道行数,但我认为重复Nexts效率低下。 – 2013-04-24 05:15:04

+0

在内存中执行列表结构遍历比SQL查询更有效。您还可以通过几行代码找到所有问题的答案,这比更复杂的解决方案要容易得多。但是,使用'rows.Next()'似乎是'database/sql'现在提供的唯一解决方案,或者使用缓存机制。 – 2013-04-24 05:44:41