繁体   English   中英

将查询移至处理程序将获得“未定义:db”(golang)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM