2
package main

import (
    "encoding/json"
    "gorilla/mux"
    "log"
    "net/http"
    "database/sql"
    _ "go-sql-driver/mysql"
    )

func GetPeople(w http.ResponseWriter, r *http.Request, db *sql.DB) {
    json.NewEncoder(w).Encode(db.QueryRow("SELECT * from test.animal"))
}

func main() {

db, err := sql.Open("mysql", "root:mariadb@tcp(127.0.0.1:3306)/test")
if err != nil {
    panic(err.Error())
}
defer db.Close()
router := mux.NewRouter()

router.HandleFunc("/people", GetPeople).Methods("GET")

log.Fatal(http.ListenAndServe(":8000", router))
}

I need to make my db recognized inside the GetPeople function but giving the function a third parameter (db *sql.DB) is impossible.

How can I solve it? Thank you

1
  • 2
    "How can I solve it?" Globals or closures. Commented Sep 28, 2017 at 8:49

2 Answers 2

5

Another way to do this is using closures, this prevents global use of variables:

func GetPeopleHandler(db *sql.DB) func (w http.ResponseWriter, r *http.Request) {
    return func (w http.ResponseWriter, r *http.Request) {
        json.NewEncoder(w).Encode(db.QueryRow("SELECT * from test.animal"))
    }
}

func main() {
    var err error
    db, err = sql.Open("mysql", "root:mariadb@tcp(127.0.0.1:3306)/test")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()
    router := mux.NewRouter()

    router.HandleFunc("/people", GetPeopleHandler(db)).Methods("GET")

    log.Fatal(http.ListenAndServe(":8000", router))
}
Sign up to request clarification or add additional context in comments.

1 Comment

I get an error when i use this: struct type 'database/sql.Row' doesn't have any exported fields, nor custom marshaling (SA9005)go-staticcheck The error happens on the db.QueryRow('') section, i am also having to use the github.com/denisenkom/go-mssqldb driver
1

Simply make your db variable global, not local in main():

var db *sql.DB

func GetPeople(w http.ResponseWriter, r *http.Request) {
    json.NewEncoder(w).Encode(db.QueryRow("SELECT * from test.animal"))
}

func main() {
    var err error
    db, err = sql.Open("mysql", "root:mariadb@tcp(127.0.0.1:3306)/test")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    router := mux.NewRouter()
    router.HandleFunc("/people", GetPeople).Methods("GET")
    log.Fatal(http.ListenAndServe(":8000", router))
}

See related questions:

How to use global var across files in a package?

Performance difference between global database connection and opening connection everytime on Golang

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.