调用 db.Ping() 时的无限循环
Infinite loop when db.Ping() is called
我正在尝试创建到数据库的基本连接。当我尝试使用 db.Ping()
测试连接时出现问题;一切正常,直到我到达这条线。 Ping
将程序送入无限循环(函数调用永远不会 returns),我不确定如何解决这个问题。
package main
import (
"database/sql"
"fmt"
"html/template"
"net/http"
_ "github.com/lib/pq"
}
type Page struct {
Name string
DBStatus bool
}
const (
host = "localhost"
port = 8080
user = "username"
password = "password"
dbname = "GoTest"
)
func main() {
templates := template.Must(template.ParseFiles("templates/index.html"))
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
panic(err)
}
defer db.Close()
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
p := Page{Name: "Gopher"}
if name := r.FormValue("name"); name != "" {
p.Name = name
}
p.DBStatus = db.Ping() == nil //this point is reached but never returned
if err := templates.ExecuteTemplate(w, "index.html", p); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
})
fmt.Println(http.ListenAndServe(":8080", nil))
}
看来我可以很好地连接到数据库,因为 sql.Open
调用没有 return 错误,如果我在 http 服务器句柄之外调用 Ping
功能,它也 return 就好了。
如有任何帮助,我们将不胜感激!
你的数据库配置有误。它指向 Golang 服务器端口 8080
。它应该指向 pgsql 端口(默认 5432)
我正在尝试创建到数据库的基本连接。当我尝试使用 db.Ping()
测试连接时出现问题;一切正常,直到我到达这条线。 Ping
将程序送入无限循环(函数调用永远不会 returns),我不确定如何解决这个问题。
package main
import (
"database/sql"
"fmt"
"html/template"
"net/http"
_ "github.com/lib/pq"
}
type Page struct {
Name string
DBStatus bool
}
const (
host = "localhost"
port = 8080
user = "username"
password = "password"
dbname = "GoTest"
)
func main() {
templates := template.Must(template.ParseFiles("templates/index.html"))
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
panic(err)
}
defer db.Close()
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
p := Page{Name: "Gopher"}
if name := r.FormValue("name"); name != "" {
p.Name = name
}
p.DBStatus = db.Ping() == nil //this point is reached but never returned
if err := templates.ExecuteTemplate(w, "index.html", p); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
})
fmt.Println(http.ListenAndServe(":8080", nil))
}
看来我可以很好地连接到数据库,因为 sql.Open
调用没有 return 错误,如果我在 http 服务器句柄之外调用 Ping
功能,它也 return 就好了。
如有任何帮助,我们将不胜感激!
你的数据库配置有误。它指向 Golang 服务器端口 8080
。它应该指向 pgsql 端口(默认 5432)