Skip to content

Instantly share code, notes, and snippets.

@praveen001
Last active August 27, 2021 16:38
Show Gist options
  • Save praveen001/12bcd71a9b53f187376db0c6db64b551 to your computer and use it in GitHub Desktop.
Save praveen001/12bcd71a9b53f187376db0c6db64b551 to your computer and use it in GitHub Desktop.
How to Pass Database Connection into Controllers in Golang
package controllers
import (
"fmt"
"net/http"
"github.com/techinscribed/repository-db/models"
)
// BaseHandler will hold everything that controller needs
type BaseHandler struct {
userRepo models.UserRepository
}
// NewBaseHandler returns a new BaseHandler
func NewBaseHandler(userRepo models.UserRepository) *BaseHandler {
return &BaseHandler{
userRepo: userRepo,
}
}
// HelloWorld returns Hello, World
func (h *BaseHandler) HelloWorld(w http.ResponseWriter, r *http.Request) {
if user, err := h.userRepo.FindByID(1); err != nil {
fmt.Println("Error", user)
}
w.Write([]byte("Hello, World"))
}
package sqldb
import "database/sql"
// DB is a global variable to hold db connection
var DB *sql.DB
// ConnectDB opens a connection to the database
func ConnectDB() {
db, err := sql.Open("mysql", "username:password@/dbname")
if err != nil {
panic(err.Error())
}
DB = db
}
package main
import (
"fmt"
"net/http"
"github.com/techinscribed/repository-db/controllers"
"github.com/techinscribed/repository-db/repositories"
"github.com/techinscribed/repository-db/sqldb"
)
func main() {
db := sqldb.ConnectDB()
// Create repos
userRepo := repositories.NewUserRepo(db)
h := controllers.NewBaseHandler(userRepo)
http.HandleFunc("/", h.HelloWorld)
s := &http.Server{
Addr: fmt.Sprintf("%s:%s", "localhost", "5000"),
}
s.ListenAndServe()
}
package repositories
import (
"database/sql"
"github.com/techinscribed/repository-db/models"
)
// UserRepo implements models.UserRepository
type UserRepo struct {
db *sql.DB
}
// NewUserRepo ..
func NewUserRepo(db *sql.DB) *UserRepo {
return &UserRepo{
db: db,
}
}
// FindByID ..
func (r *UserRepo) FindByID(ID int) (*models.User, error) {
return &models.User{}, nil
}
// Save ..
func (r *UserRepo) Save(user *models.User) error {
return nil
}
package sqldb
import "database/sql"
// ConnectDB opens a connection to the database
func ConnectDB() *sql.DB {
db, err := sql.Open("mysql", "username:password@/dbname")
if err != nil {
panic(err.Error())
}
return db
}
package controllers
import (
"fmt"
"net/http"
"github.com/techinscribed/global-db/sqldb"
)
// HelloWorld returns Hello, World
func HelloWorld(w http.ResponseWriter, r *http.Request) {
if err := sqldb.DB.Ping(); err != nil {
fmt.Println("DB Error")
}
w.Write([]byte("Hello, World"))
}
package controllers
import (
"database/sql"
"fmt"
"net/http"
)
// BaseHandler will hold everything that controller needs
type BaseHandler struct {
db *sql.DB
}
// NewBaseHandler returns a new BaseHandler
func NewBaseHandler(db *sql.DB) *BaseHandler {
return &BaseHandler{
db: db,
}
}
// HelloWorld returns Hello, World
func (h *BaseHandler) HelloWorld(w http.ResponseWriter, r *http.Request) {
if err := h.db.Ping(); err != nil {
fmt.Println("DB Error")
}
w.Write([]byte("Hello, World"))
}
package main
import (
"fmt"
"net/http"
"github.com/techinscribed/struct-db/controllers"
"github.com/techinscribed/struct-db/sqldb"
)
func main() {
db := sqldb.ConnectDB()
h := controllers.NewBaseHandler(db)
http.HandleFunc("/", h.HelloWorld)
s := &http.Server{
Addr: fmt.Sprintf("%s:%s", "localhost", "5000"),
}
s.ListenAndServe()
}
package models
// User ..
type User struct {
Name string
}
// UserRepository ..
type UserRepository interface {
FindByID(ID int) (*User, error)
Save(user *User) error
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment