[英]Moving query to handler gets “undefined: db” (golang)
我正在尝试使用Golang作为REST API。 我设法让处理程序也可以工作和查询。 但是没有在处理程序中查询到工作。
当查询驻留在main()中时,它将起作用:
func handleRequests() {
http.HandleFunc("/getuser", Getuser)
}
---> this handler gets respons on localhost:8080/getuser
func Getuser(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Getuser")
}
func main() {
handleRequests()
//Connect to db
rows, err := db.Queryx(`SELECT "USER_ID","USER_NAME" FROM user`)
for rows.Next() {
results := make(map[string]interface{})
err = rows.MapScan(results)
fmt.Printf("%#v\n", results)
}
log.Fatal(http.ListenAndServe(":8080", nil))
}
但是,当我将查询移至处理程序时,会出现未定义数据库的错误。
func handleRequests() {
http.HandleFunc("/getuser", Getuser)
}
---> this gives the error that the db is not defined
func Getuser(w http.ResponseWriter, r *http.Request) {
rows, err := db.Queryx(`SELECT "USER_ID","USER_NAME" FROM user`)
for rows.Next() {
results := make(map[string]interface{})
err = rows.MapScan(results)
fmt.Printf("%#v\n", results)
}
}
func main() {
handleRequests()
//Connect to db
log.Fatal(http.ListenAndServe(":8080", nil))
}
编辑
处理程序中的完整代码(建议添加db var),但在“ err”上给出各种错误。
var db *sqlx.DB <---solved the db problem
func Getsign(w http.ResponseWriter, r *http.Request) {
rows, err := db.Queryx(`SELECT "USER_ID","USER_NAME" FROM user`)
for rows.Next() {
results := make(map[string]interface{})
err = rows.MapScan(results)
fmt.Printf("%#v\n", results)
}
defer rows.Close()
if err := rows.Err(); err != nil {
log.Fatal(err)
}
}
任何提示我做错了吗?
在main之外定义您的db变量,例如:
var db *sql.DB
func handler(w http.ResponseWriter, r *http.Request) {
rows, err := db.Query(...)
// use it
}
func main() {
db, _ = sql.Open(...)
}
对于您在发布的代码中看到的信息(下次我建议发布完整的代码),您是在主函数上声明db变量,但在没有该变量可见性的函数中引用了它。 为了解决该问题,您可以采用多种方式。 最简单的方法是声明一个全局变量,如var db typename
并且在主函数上不要使用:=
Assign,而只能使用=
。 在这种模式下,您可以设置全局变量(在其他情况下,您将在主函数中创建一个名为db的局部变量)。 请注意,在并发环境中这可能是一个问题,请考虑研究驱动程序库以查看是否对并发或最佳实践有一定的保证。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.