Belajar Golang Database
Seperti yang kita tahu kalau bahasa pemrograman Golang secara default memiliki standar library termasuk untuk menangani koneksi ke database, yaitu melalui package database/sql. Dengan package ini, kita bisa sangat fleksibel menggunakan database apa pun karena sudah mengikuti standar database pada umumnya.
Waktu pertama kali gue belajar database di Go, gue kira tinggal panggil sql.Open() dan selesai. 3 jam kemudian — aplikasi gak connect, error gak jelas, dan gue bingung harus ngapain.
Ternyata masalahnya simpel: gue lupa install driver MySQL. Go gak punya driver database bawaan — lo harus explicit ngasih tau database apa yang lo pake. Berasa sepele, tapi ini fundamental yang sering dilompatin tutorial.
Artikel ini gue tulis khusus buat lo yang baru mulai pake database di Go — dari koneksi sampe connection pool, dari yang sering salah sampe yang bener.
Driver: Pilih Database, Install Driver-nya
Package database/sql adalah abstraction layer. Dia nyediain interface yang seragam buat semua SQL database. Tapi buat connect ke database tertentu (MySQL, PostgreSQL, SQLite), lo butuh driver spesifik.
Cara install driver: cukup import aja pake blank identifier — efek sampingnya doang yang dibutuhin (registrasi driver ke database/sql).
Daftar driver: https://go.dev/wiki/SQLDrivers
Koneksi: sql.Open() Bukan Buat Connect
Kesalahan gue: ngira sql.Open() itu bikin koneksi dan connect ke database. Padahal sql.Open() cuma bikin pool object — koneksi beneran terjadi pas lo execute query pertama.
Ini penting karena sql.Open() gak akan return error kalo database-nya mati. Error connection barulah muncul pas lo panggil .Ping() atau .Query().
Jangan lupa close db pas aplikasi mati. Tapi jangan close tiap selesai query — db.Close() nutup seluruh pool, bukan satu koneksi.
Connection Pool: sql.DB Itu Bukan Satu Koneksi
Poin yang paling sering salah paham: sql.DB itu ngelola pool koneksi, bukan satu koneksi. Pas lo query, diambil satu koneksi dari pool. Pas selesai, dikembalikan. Pool ini thread-safe — aman dipake dari banyak goroutine.
Tapi pool harus dikonfigurasi. Default-nya gak ada batas maksimal koneksi — kalo lo lupa set MaxOpenConns, dan aplikasi lo spike, database bisa kebanjiran.
Pengalaman gue: lupa set MaxOpenConns, aplikasi kena spike request, database MySQL connection limit exceeded. Service down 10 menit.
DML vs DQL: ExecContext vs QueryContext
Go punya dua cara execute query, dan milih yang salah bisa bikin connection leak.
DML (INSERT, UPDATE, DELETE) — pake ExecContext
ExecContext ngembaliin sql.Result (RowsAffected, LastInsertId). Gak ngunci koneksi — langsung balik ke pool abis execute.
DQL (SELECT) — pake QueryContext
QueryContext ngunci satu koneksi dari pool sampe lo panggil rows.Close(). Kalo lupa close, koneksi ilang dari pool — bisa habis.
Best Practice: Pattern GetUsers yang Aman
Gabungin semua pelajaran di atas: context untuk timeout, scan dengan error handling, dan — jangan lupa — defer rows.Close().
Kesimpulan: 3 Hal yang Sering Salah
- sql.Open bukan connect — pake Ping() buat verifikasi
- sql.DB itu pool, bukan koneksi — konfigurasi MaxOpenConns biar gak kebanjiran
- QueryContext ngunci koneksi — jangan lupa rows.Close()
3 pelajaran ini gue bayar pake 1 production incident + 3 jam debugging. Lo gak perlu.
