我尝试使用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
答案 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
的缓冲区来控制数据库缓冲。根据您的应用程序,您可能不希望关闭结果 - 这取决于您。