2

我正在尝试将 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)
    }
}

任何提示我做错了什么?

4

2 回答 2

3

在 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(...)
}
于 2018-03-21T13:24:45.987 回答
0

对于我在您发布的代码中看到的内容(下次我建议发布完整代码),您在主函数上声明了 db 变量,但您在一个对该变量不可见的函数中引用它。为了解决问题,您有多种方法。最简单的方法是在 main 函数上声明一个全局变量,比如var db typename和 ,不要使用:=assign ,而只使用=. 在这种模式下,您可以设置全局变量(在另一种情况下,您将在主函数中创建一个名为 db 的局部变量)。请注意,在并发环境中这可能是一个问题,考虑研究您的驱动程序库,看看是否对并发或最佳实践有一些保证。

于 2018-03-21T13:48:59.783 回答