Hi guys,
Please I am having a little issue with my go project using docker.

I set up my Postgres db in docker with my go app but it is unable to
connect. Please what could be the issue?

I will share the docker-compose file and the main.go here

main.go

package main

import (
"database/sql"
"encoding/json"
"log"
"net/http"
"os"

"github.com/gorilla/mux"
_ "github.com/lib/pq"
)

type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}

var db *sql.DB
var err error

func main() {
//connect to database
db, err = sql.Open("postgres", os.Getenv("DATABASE_URL"))
log.Println("DATABASE_URL:", os.Getenv("DATABASE_URL"))

if err != nil {
log.Fatal("Error connecting to database: ", err)
}
if db != nil {
log.Println("Database connected")
}
if err := db.Ping(); err != nil {
log.Fatal("Error pinging database: ", err)
}

defer db.Close()

//create the table if it doesn't exist
_, err = db.Exec("CREATE TABLE IF NOT EXISTS users (id SERIAL PRIMARY KEY,
name TEXT, email TEXT)")

if err != nil {
log.Fatal("Error creating table: ", err)
}

//create router
router := mux.NewRouter()
router.HandleFunc("/users", getUsers(db)).Methods("GET")
router.HandleFunc("/users/{id}", getUser(db)).Methods("GET")
router.HandleFunc("/users", createUser(db)).Methods("POST")
router.HandleFunc("/users/{id}", updateUser(db)).Methods("PUT")
router.HandleFunc("/users/{id}", deleteUser(db)).Methods("DELETE")

//start server
log.Fatal(http.ListenAndServe(":8088", jsonContentTypeMiddleware(router)))
}

func jsonContentTypeMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
next.ServeHTTP(w, r)
})
}

// get all users
func getUsers(db *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
rows, err := db.Query("SELECT * FROM users")
if err != nil {
log.Fatal(err)
}
defer rows.Close()

users := []User{}
for rows.Next() {
var u User
if err := rows.Scan(&u.ID, &u.Name, &u.Email); err != nil {
log.Fatal(err)
}
users = append(users, u)
}
if err := rows.Err(); err != nil {
log.Fatal(err)
}

json.NewEncoder(w).Encode(users)
}
}

// get user by id
func getUser(db *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id := vars["id"]

var u User
err := db.QueryRow("SELECT * FROM users WHERE id = $1",
id).Scan(&u.ID, &u.Name,
&u.Email)
if err != nil {
w.WriteHeader(http.StatusNotFound)
return
}

json.NewEncoder(w).Encode(u)
}
}

// create user
func createUser(db *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var u User
json.NewDecoder(r.Body).Decode(&u)

err := db.QueryRow("INSERT INTO users (name, email) VALUES ($1, $2)
RETURNING id", u.Name, u.Email).Scan(&u.ID)
if err != nil {
log.Fatal(err)
}

json.NewEncoder(w).Encode(u)
}
}

// update user
func updateUser(db *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
var u User
json.NewDecoder(r.Body).Decode(&u)

vars := mux.Vars(r)
id := vars["id"]

_, err := db.Exec("UPDATE users SET name = $1, email = $2 WHERE id = $3",
u.Name, u.Email, id)
if err != nil {
log.Fatal(err)
}

json.NewEncoder(w).Encode(u)
}
}

// delete user
func deleteUser(db *sql.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id := vars["id"]

var u User
err := db.QueryRow("SELECT * FROM users WHERE id = $1",
id).Scan(&u.ID, &u.Name,
&u.Email)
if err != nil {
w.WriteHeader(http.StatusNotFound)
return
} else {
_, err := db.Exec("DELETE FROM users WHERE id = $1", id)
if err != nil {
//todo : fix error handling
w.WriteHeader(http.StatusNotFound)
return
}

json.NewEncoder(w).Encode("User deleted")
}
}
}


Docker compose file:

version: '3.9'

services:
go-app:
container_name: go-app
image: sunnex/go-app:1.0.0
build: .
environment:
- DATABASE_URL="host=go_db port=5432 user=postgres password=postgres
dbname=go_db sslmode=disable"
ports:
- "8088:8088"
networks:
- backend
depends_on:
- go_db
go_db:
container_name: go_db
image: postgres:13
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: go_db
ports:
- "5432:5432"
networks:
- backend
volumes:
- pgdata:/var/lib/postgresql/data

volumes:
pgdata: {}

networks:
backend:
driver: bridge

Keep getting this error:
Error pinging database: *dial tcp 127.0.0.1:5432 <http://127.0.0.1:5432>:
connect: connection refused*


Please where am I getting it wrong?

Regards


*AJAYI Sunday *
(+234) 806 771 5394
*sunnexaj...@gmail.com <sunnexaj...@gmail.com>*



On Sat, Feb 17, 2024 at 11:38 PM Pilar Garcia <prototect...@gmail.com>
wrote:

> hi everyone. my name is pilar. im trying to learn coding for the first
> time in my life......im sooooo lost can anyone let me know how to even
> begin on this mission......... please any advise will be greatly
> appreciated..... you folks have a great day cant waint to hear from ya
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/golang-nuts/9b1fee4f-919f-4bee-a7f0-2fe2ae685542n%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/9b1fee4f-919f-4bee-a7f0-2fe2ae685542n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/CAKYSAw1%2B5J-TUFkPD30XROdd%3DFHfTMsPy6O3a5rYffzaJK4cpQ%40mail.gmail.com.

Reply via email to