我有一个使用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
我必须做一些愚蠢的事情 - 线索赞赏。
答案 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包。