使用sql.ErrNoRows的数据库/ sql中的示例崩溃并烧伤

时间:2016-07-24 18:48:51

标签: postgresql go

我有一个使用postgresql数据库的小型Go程序。在其中有一个查询,它不能返回任何行,我用来处理它的代码无法正常工作。

    // Get the karma value for nick from the database.
func getKarma(nick string, db *sql.DB) string {
    var karma int
    err := db.QueryRow("SELECT SUM(delta) FROM karma WHERE nick = $1", nick).Scan(&karma)
    var karmaStr string
    switch {
    case err == sql.ErrNoRows:
        karmaStr = fmt.Sprintf("%s has no karma.", nick)
    case err != nil:
        log.Fatal(err)
    default:
       karmaStr = fmt.Sprintf("Karma for %s is %d.", nick, karma)
    }
    return karmaStr
}

此逻辑直接来自Go documentation。如果没有与 nick 对应的行,则会发生以下错误:

2016/07/24 19:37:07 sql: Scan error on column index 0: converting driver.Value type <nil> ("<nil>") to a int: invalid syntax

我必须做一些愚蠢的事情 - 线索赞赏。

2 个答案:

答案 0 :(得分:2)

我相信您的问题是,您从数据库中获得了NULL值,该值将转换为nil。但是,您正在扫描一个整数,它没有nil的概念。您可以做的一件事是扫描到实现sql.Scanner接口的类型(并且可以处理NULL值),例如sql.NullInt64

documentation的示例代码中,我假设他们在NOT NULL列上有username个约束。我认为这是因为他们不想让人们相信你已经全面使用支持NULL的类型。

答案 1 :(得分:1)

我重写了代码以获得我想要的结果。

SELECT name 
FROM master.dbo.sysdatabases

试图将某种文档补丁提交给database / sql包。