将查询移动到处理程序得到 "undefined: 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(...)
}
对于我在您 post 编辑的代码中看到的内容(下次我建议 post 完整代码)您在 main 函数上声明了 db 变量,但您正在引用它在对该变量不可见的函数中。为了解决这个问题,你有多种方法。最简单的方法是声明一个全局变量,如 var db typename
,并且在主函数上不要使用 :=
赋值,而只使用 =
。在这种模式下,您可以设置全局变量(在另一种情况下,您将在主函数中创建一个名为 db 的局部变量)。请注意,在并发环境中,这可能是个问题,请考虑研究您的驱动程序库,看看是否对并发或最佳实践有一定的保证。
我正在尝试将 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(...)
}
对于我在您 post 编辑的代码中看到的内容(下次我建议 post 完整代码)您在 main 函数上声明了 db 变量,但您正在引用它在对该变量不可见的函数中。为了解决这个问题,你有多种方法。最简单的方法是声明一个全局变量,如 var db typename
,并且在主函数上不要使用 :=
赋值,而只使用 =
。在这种模式下,您可以设置全局变量(在另一种情况下,您将在主函数中创建一个名为 db 的局部变量)。请注意,在并发环境中,这可能是个问题,请考虑研究您的驱动程序库,看看是否对并发或最佳实践有一定的保证。