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 }