Migration: Memudahkan Hidup Anda

Norman Bintang
LEARNFAZZ
Published in
2 min readMar 20, 2019

Apa itu migration?

Migration adalah sebuah sistem manajemen terhadap perubahan database. Jika git adalah Version Control System untuk kode Anda, maka migration dapat dilihat sebagai Version Control System untuk database Anda. Ini artinya semua perubahan terhadap database harus tercatat pada migration. Dan karena seperti VCS, migration juga harus bersifat reversible. Ini dibutuhkan apabila ternyata migration yang baru menimbulkan masalah pada database, database dapat dirollback ke versi migration yang sebelumnya.

Mengapa menggunakan migration?

Migration digunakan karena aplikasi yang dibuat tidak hanya berjalan menggunakan 1 database. Di antaranya database local untuk development di komputer sendiri, database local di komputer teman, database staging, production, dan lainnya. Akan sangat merepotkan apabila terdapat perubahan terhadap database yang tidak tercatat, karena harus mengupdate semua database yang ada secara manual. Hal-hal yang dilakukan secara manual juga rentan menemukan masalah.

Sebenarnya hal ini tidak terbatas hanya pada migration, melainkan semua admin process. Karena hal tersebut di luar konteks ini, Anda dapat melihat hal tersebut pada tautan ini https://12factor.net/admin-processes .

Framework aplikasi kami tidak memberikan fitur migration, bagaimana?

Membuat fitur migration sederhana sebenarnya tidak terlalu susah. Yang harus dilakukan adalah:

  1. Membuat tabel untuk menyimpan versi migration terbaru
  2. Membuat program yang mengeksekusi file SQL yang berisi perubahan schema database. Setelah SQL berhasil dieksekusi, update nilai versi migration pada tabel yang dibuat pada nomor 1.

Penerapan pada LEARNFAZZ

Untuk penerapan pada proyek LEARNFAZZ, kami tidak membuat sistem migration sendiri karena di luar sana sudah ada orang baik yang membuatkannya :). Kami menggunakan https://github.com/golang-migrate/migrate .

Sebenarnya sistem migration tidak berhubungan dengan bahasa yang digunakan pada aplikasi. Bisa saja Anda menggunakan aplikasi tersebut walaupun Anda tidak mengembangkan aplikasi menggunakan golang, karena migration hanya akan berhubungan pada database Anda.

Berikut yang kami lakukan apabila ingin membuat migrations, misalnya membuat tabel enrollments. Yang perlu dilakukan adalah:

  1. Membuat file SQL yang berisi perintah untuk membuat tabel enrollments
CREATE TABLE enrollments (
id SERIAL PRIMARY KEY,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
user_id INT REFERENCES users(id),
course_id INT REFERENCES courses(id)
);CREATE INDEX index_user_course ON enrollments(user_id, course_id);

2. Membuat file SQL yang berisi kebalikan dari perintah di atas, karena migration harus bersifat reversible

DROP TABLE enrollments;

Loh, kok hanya drop table? Tidak ada drop index?

Ini karena menghapus table sudah termasuk menghapus index, maka perintah untuk menghapus index tidak perlu ditulis secara eksplisit. Tetapi jika ingin ditulis juga tidak masalah.

3. Menjalankan migration.

Migration dijalankan dengan perintah

migrate -path path/to/migration/files -database postgres://urltodatabase up

Jangan lupa untuk memperhatikan perintah untuk menjalankan migration pada CI/CD aplikasi. Pada kelompok kami, karena deployment menggunakan docker, kami menuliskan perintah untuk migrate pada docker-entrypoint.sh

Migration juga dapat digunakan untuk seeding database. Tetapi hanya seeding untuk data yang benar-benar dipakai di production, contohnya jika membuat aplikasi penampung cerpen, yaitu membuat seed kategori-kategori cerpen.

Jika ingin melakukan seeding untuk mengisi data dummy agar aplikasi bisa didemokan, sebaiknya jangan dicampur dengan migration yang lain. Karena tentu kita tidak mau data-data dummy tersebut muncul di database production.

--

--