
Ahmed Raza IdrisiIn the previous post, we built a simple CRUD API in Go using in-memory storage. Now letβs make it...
In the previous post, we built a simple CRUD API in Go using in-memory storage.
Now letβs make it real-world ready by connecting it to a database:
π PostgreSQL
Weβll use the official driver:
go get github.com/lib/pq
package main
import (
"database/sql"
"log"
_ "github.com/lib/pq"
)
var db *sql.DB
func initDB() {
connStr := "user=postgres password=postgres dbname=testdb sslmode=disable"
var err error
db, err = sql.Open("postgres", connStr)
if err != nil {
log.Fatal(err)
}
err = db.Ping()
if err != nil {
log.Fatal("DB not reachable:", err)
}
log.Println("Connected to PostgreSQL β
")
}
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL
);
type User struct {
ID int `json:"id"`
Name string `json:"name"`
}
func createUser(w http.ResponseWriter, r *http.Request) {
var user User
json.NewDecoder(r.Body).Decode(&user)
err := db.QueryRow(
"INSERT INTO users(name) VALUES($1) RETURNING id",
user.Name,
).Scan(&user.ID)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
json.NewEncoder(w).Encode(user)
}
func getUsers(w http.ResponseWriter, r *http.Request) {
rows, err := db.Query("SELECT id, name FROM users")
if err != nil {
http.Error(w, err.Error(), 500)
return
}
defer rows.Close()
var users []User
for rows.Next() {
var user User
rows.Scan(&user.ID, &user.Name)
users = append(users, user)
}
json.NewEncoder(w).Encode(users)
}
func updateUser(w http.ResponseWriter, r *http.Request) {
idParam := r.URL.Query().Get("id")
var user User
json.NewDecoder(r.Body).Decode(&user)
_, err := db.Exec(
"UPDATE users SET name=$1 WHERE id=$2",
user.Name, idParam,
)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
json.NewEncoder(w).Encode("Updated")
}
func deleteUser(w http.ResponseWriter, r *http.Request) {
idParam := r.URL.Query().Get("id")
_, err := db.Exec("DELETE FROM users WHERE id=$1", idParam)
if err != nil {
http.Error(w, err.Error(), 500)
return
}
json.NewEncoder(w).Encode("Deleted")
}
func main() {
initDB()
http.HandleFunc("/users", getUsers)
http.HandleFunc("/create", createUser)
http.HandleFunc("/update", updateUser)
http.HandleFunc("/delete", deleteUser)
log.Println("Server running on :8080")
http.ListenAndServe(":8080", nil)
}
Same as before, but now data is stored in PostgreSQL π
This is still beginner-level. To make it production-ready:
INSERT, SELECT, UPDATE, DELETE)π Proper API structure in Go (like Laravel mindset)
π Using Docker with Go + PostgreSQL
π Adding authentication (JWT)
Now you're no longer just learning Goβ¦
π You're building backend systems.