Go:如何使用sql / db包从mysql中检索多个结果

时间:2014-08-14 14:53:26

标签: mysql go

我尝试使用Go中的sql / db包从表中获取数据。我的数据库表包含用户名" shaw"。用户名为shaw的几行包含在post列中的不同帖子。我有以下代码:

GO:

func ReadData() string {
    db, err := sql.Open("mysql", "user1@/my_db")
    if err != nil {
        fmt.Println(err)
    }
    defer db.Close()

    var tweet string

    rows, err := db.Query("select tweet from posts where username = ?", "shaw")
    if err != nil {
        fmt.Println(err)
    }
    defer rows.Close()

    for rows.Next() {
        err := rows.Scan(&tweet)
        if err != nil {
            fmt.Println(err)
        }
        fmt.Printf("this %s", tweet)
        return tweet
    }
    return ""
}

显示的结果只给出了表中的1个值,而不是与" Shaw"相关的其他值。如何获取超过1个结果?

根据此处的文档,似乎没有任何错误。https://code.google.com/p/go-wiki/wiki/SQLInterface

2 个答案:

答案 0 :(得分:2)

因为您返回第一条推文并退出该函数,要返回多条推文,您必须返回一个切片,例如:

func ReadData() (res []string) {
    db, err := sql.Open("mysql", "user1@/my_db")
    if err != nil {
        fmt.Println(err)
    }
    defer db.Close()

    rows, err := db.Query("select tweet from posts where username = ?", "shaw")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer rows.Close()

    var tweet string
    for rows.Next() {
        err := rows.Scan(&tweet)
        if err != nil {
            fmt.Println(err)
            return
        }
        fmt.Printf("this %s", tweet)
        res = append(res, tweet)
    }
    return
}

答案 1 :(得分:0)

OneOfOne的答案很好,但您可能想要更改该功能,以便它不会返回切片,而是在频道上发送推文。这样,您可以在完成发送之前开始使用结果。在这种情况下,您需要以下内容:

func ReadData() (res chan<- string) {
    db, err := sql.Open("mysql", "user1@/my_db")
    if err != nil {
        fmt.Println(err)
    }

    rows, err := db.Query("select tweet from posts where username = ?", "shaw")
    if err != nil {
        fmt.Println(err)
        db.Close()
        close(res)
        return
    }
    go func(res chan<- string) {
        defer db.Close()
        defer rows.Close()
        defer close(res)
        var tweet string
        for rows.Next() {
            err := rows.Scan(&tweet)
            if err != nil {
                fmt.Println(err)
                return
            }
            fmt.Printf("this %s", tweet)
            res <- tweet
        }
        return
    }(res)
}

然后,您可以通过更改输入res chan<- string的缓冲区来控制数据库缓冲。根据您的应用程序,您可能不希望关闭结果 - 这取决于您。