76 lines
1.9 KiB
Go
76 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"fmt"
|
|
"time"
|
|
|
|
_ "github.com/lib/pq"
|
|
)
|
|
|
|
var DB *sql.DB
|
|
|
|
func InitDB() {
|
|
dbURL := "postgres://5803024006:5803024006@202.46.28.160:45432/tgs03_5803024006?sslmode=disable"
|
|
|
|
var err error
|
|
DB, err = sql.Open("postgres", dbURL)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// setting pool
|
|
DB.SetMaxOpenConns(10)
|
|
DB.SetMaxIdleConns(5)
|
|
DB.SetConnMaxLifetime(time.Minute * 5)
|
|
|
|
// test koneksi
|
|
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
|
|
defer cancel()
|
|
if err = DB.PingContext(ctx); err != nil {
|
|
panic(fmt.Sprintf("gagal koneksi database: %v", err))
|
|
}
|
|
|
|
fmt.Println("✅ Database connected!")
|
|
}
|
|
|
|
// ===== CRUD Contoh =====
|
|
|
|
func CreateUser(name, email string) (int, error) {
|
|
var id int
|
|
err := DB.QueryRow(`INSERT INTO users (name, email) VALUES ($1, $2) RETURNING id`, name, email).Scan(&id)
|
|
return id, err
|
|
}
|
|
|
|
func CreateCourse(title, desc string) (int, error) {
|
|
var id int
|
|
err := DB.QueryRow(`INSERT INTO courses (title, description) VALUES ($1, $2) RETURNING id`, title, desc).Scan(&id)
|
|
return id, err
|
|
}
|
|
|
|
func EnrollUser(userID, courseID int) error {
|
|
_, err := DB.Exec(`INSERT INTO enrollments (user_id, course_id) VALUES ($1, $2) ON CONFLICT (user_id, course_id) DO NOTHING`, userID, courseID)
|
|
return err
|
|
}
|
|
|
|
func ListEnrollments() error {
|
|
rows, err := DB.Query(`SELECT u.name, c.title, e.created_at
|
|
FROM enrollments e
|
|
JOIN users u ON e.user_id = u.id
|
|
JOIN courses c ON e.course_id = c.id`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer rows.Close()
|
|
|
|
fmt.Println("=== Enrollments ===")
|
|
for rows.Next() {
|
|
var name, title string
|
|
var created time.Time
|
|
_ = rows.Scan(&name, &title, &created)
|
|
fmt.Printf("%s enrolled in %s at %v\n", name, title, created)
|
|
}
|
|
return nil
|
|
}
|