← All articles
Technology

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.

Muhammad AmienMuhammad Amien·Jun 24, 2026·3 min read
Belajar Golang Database

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.

Share this article
XLinkedInWhatsAppTelegram
Muhammad Amien

Muhammad Amien

Building software that bridges the gap between design and engineering. React, Laravel, and the art of shipping.

Have a project in mind?

I'm currently available for freelance work and collaboration. Let's build something together.

Get in Touch →

Comments

0 responses
Loading...
Loading comments
Belajar Golang Database | Muhammad Amien