
Pendahuluan
Bayangkan kamu sedang mengembangkan aplikasi impianmu. Semua erjalan lancar sampai suatu hari, klien atau timmu meminta perubahan besar pada struktur database. “Kami butuh tabel baru untuk produk!” atau “Bisa gak tambah kolom last_login
di tabel pengguna?”. Terdengar familiar? Nah, inilah saatnya kita masuk ke dunia migrasi database
Apa Itu Migrasi Database?
Migrasi database adalah proses mengubah skema database dari satu keadaan ke keadaan lain dengan aman dan terkontrol. Proses ini mencakup segala sesuatu mulai dari menambah tabel baru, mengubah struktur tabel yang sudah ada, hingga menghapus tabel yang tidak lagi dibutuhkan.
Kenapa Migrasi Database Penting?
- Keamanan Data
Bayangkan kamu memiliki toko buku fisik. Setiap kali kamu menambah rak baru atau mengatur ulang buku di rak, kamu harus memastikan tidak ada buku yang hilang atau rusak. Sama halnya dengan database. Mengelola perubahan skema database dengan migrasi memastikan bahwa data yang sudah ada tetap aman dan tidak hilang saat kamu menambahkan tabel baru atau mengubah struktur tabel yang sudah ada. - Sinkronisasi Antar Environment
Bayangkan kamu memiliki tiga toko buku di lokasi berbeda: satu di pusat kota (production), satu di pinggiran kota (staging), dan satu lagi di rumahmu sendiri (development). Kamu ingin memastikan bahwa setiap toko memiliki tata letak rak dan stok buku yang sama. Dengan migrasi, kamu dapat memastikan bahwa struktur database di lingkungan development, staging, dan production tetap konsisten, seperti memastikan bahwa setiap toko memiliki tata letak yang sama. - Kemudahan Maintenance
Bayangkan kamu memiliki buku catatan yang mencatat setiap perubahan yang kamu lakukan pada toko buku, seperti “Menambahkan rak baru di sudut kanan” atau “Mengganti rak lama dengan yang baru”. Dokumentasi perubahan skema dalam bentuk file migrasi memudahkan tim pengembang untuk memahami sejarah perubahan database, seperti catatan yang membantu kamu mengingat perubahan yang telah dilakukan. - Automatisasi
Bayangkan kamu memiliki sistem otomatis yang dapat mengatur ulang rak buku sesuai instruksi yang kamu berikan tanpa kamu harus melakukannya secara manual. Menggunakan alat migrasi memungkinkan proses perubahan database dilakukan secara otomatis, mengurangi potensi kesalahan manusia dan memastikan setiap perubahan dilakukan dengan cara yang sama di setiap lingkungan.
Bertemu dengan golang-migrate
Suatu hari, kamu bertemu dengan seorang teman developer yang memperkenalkanmu pada golang-migrate
. “Ini adalah alat yang sangat membantu untuk mengelola migrasi database di aplikasi Golang,” katanya. Kamu pun penasaran dan mulai mengeksplorasi.
Fitur Utama golang-migrate
- Migrasi Up and Down
golang-migrate
memungkinkan kamu untuk menerapkan (up) dan membatalkan (down) perubahan skema database dengan mudah. - Versi Migrasi
Alat ini melacak versi dari setiap migrasi yang diterapkan, memastikan bahwa setiap perubahan tercatat dengan baik. - Sinkronisasi Otomatis
Dengangolang-migrate
, kamu dapat dengan mudah menyinkronkan skema database antar lingkungan yang berbeda. - Dukungan Multi-Database
golang-migrate
mendukung berbagai jenis database seperti PostgreSQL, MySQL, SQLite bahkan MongoDB dan lainnya.
Déjà Vu: Mirip dengan Laravel
Jika kamu sudah pernah mengembangkan aplikasi menggunakan Laravel, kamu pasti tersenyum mengenali konsep ini. Laravel juga menggunakan sistem migrasi yang serupa, di mana setiap perubahan skema database didokumentasikan dalam file migrasi. golang-migrate
berfungsi dengan cara yang mirip, tetapi khusus untuk aplikasi Golang. Keduanya menawarkan kemudahan dalam mengelola perubahan skema database, menjaga konsistensi antar lingkungan, dan memastikan keamanan data.
Memulai dengan golang-migrate
: Mengelola Migrasi Database dengan Mudah
Migrasi database adalah bagian penting dari pengembangan aplikasi yang kompleks. golang-migrate
adalah alat yang kuat dan fleksibel untuk mengelola migrasi database di aplikasi Golang. Dalam bagian ini, kita akan membahas cara menggunakan golang-migrate
, membuat migrasi, dan menjalankannya.
Instalasi golang-migrate
Pertama, kita perlu menginstal CLI golang-migrate
. Kamu bisa menginstalnya dengan perintah berikut:
go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest
Membuat Migrasi Baru
migrate create -ext sql -dir db/migrations create_users_table
Penjelasan Perintah migrate create
Perintah ini digunakan untuk membuat file migrasi baru. Berikut adalah rinciannya:
migrate create
: Perintah untuk membuat migrasi baru.-ext sql
: Menentukan ekstensi file migrasi yang akan dibuat. Dalam hal ini, file migrasi akan menggunakan ekstensi.sql
.-dir db/migrations
: Menentukan direktori di mana file migrasi akan disimpan. Dalam contoh ini, file migrasi akan disimpan di dalam folderdb/migrations
.create_users_table
: Nama atau deskripsi migrasi. Ini membantu untuk mengidentifikasi tujuan dari migrasi.
Apa yang Terjadi Setelah Menjalankan Perintah Ini?
Setelah menjalankan perintah tersebut, golang-migrate
akan membuat dua file migrasi baru di dalam direktori db/migrations
. Nama file-file tersebut akan memiliki format seperti berikut:
<timestamp>_create_users_table.up.sql
:
File ini digunakan untuk mendefinisikan perubahan yang akan diterapkan ke database (migrasi “up”). Di sinilah kamu menuliskan perintah SQL untuk membuat tabel, menambah kolom, atau perubahan lainnya.<timestamp>_create_users_table.down.sql
:
File ini digunakan untuk mendefinisikan perubahan yang akan dibatalkan dari database (migrasi “down”). Di sinilah kamu menuliskan perintah SQL untuk membatalkan perubahan yang dilakukan di file.up.sql
, seperti menghapus tabel atau kolom.
Contoh Hasil
Misalnya, setelah menjalankan perintah, kamu mungkin mendapatkan dua file dengan nama seperti berikut (dengan <timestamp>
diganti oleh timestamp nyata yang dihasilkan):
20240712010838_create_users_table.up.sql
20240712010838_create_users_table.down.sql
Isi File
Setelah file dibuat, kamu perlu mengisi file tersebut dengan perintah SQL yang sesuai.
20240712010838_create_users_table.up.sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL UNIQUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
20240712010838_create_users_table.down.sql
DROP TABLE IF EXISTS users;
Jalankan Migrasi
migrate -database "postgres://<username>:<password>@<host>:<port><db_name>?sslmode=disable&search_path=<db_schema>" -path db/migrations up
Cek Status Migrasi
migrate -database "postgres://<username>:<password>@<host>:<port>/<db_name>?sslmode=disable&search_path=<db_schema>" -path db/migrations version