Migrasi SQL di Golang menggunakan Goose

Gilang Prambudi
4 min readAug 8, 2020
Photo by Markus Winkler on Unsplash

Belum ada server, dev masih di lokal, biar migrasi SQL nya gak susah, bisa pakai tool ini.

Sekitar seminggu yang lalu, saya di assign ke suatu kerjaan di posisi backend pada suatu bisnis finansial swasta di Jakarta. Dan saya terkendala dengan infrastruktur development yang belum disediakan. Tau sendiri lah, proses birokrasi di perusahaan seperti itu bagaimana. Padahal sprint development sudah berjalan. Akhirnya proses development antara Backend dan Frontend terhambat karena kendala menyesuaikan developer environment, utamanya adalah setting database / persistence.

Hingga kolega saya menginstruksikan saya untuk menggunakan migration tool pada database. Memang sebelumnya saya sudah pernah mencoba migration tool di Laravel ataupun di NodeJS (menggunakan ORM Sequelize), namun belum pernah di Go. Lalu, rekan saya menyarankan library ini:

Library ini sebenarnya adalah versi fork dari repository aslinya yang ada di bitbucket

So, bagaimana cara kerjanya? Let’s explore more!

Instalasi dependency

Install Goose secara global menggunakan command go

go get -u github.com/pressly/goose/cmd/goose

Kita akan buat dummy project yang membutuhkan 3 table, users, roles dan user_roles. Database yang digunakan adalah Postgres.

Skemanya seperti berikut:

Table user

Table role

Table user_roles

Ok. Case nya seperti ini:

  1. User dan Roles memiliki associative table bernama user_roles yang keduanya di relasikan menggunakan id masing-masing
  2. Pada business usecase, Roles harus memiliki data inisial yaitu Admin dan User ketika program dijalankan

Dan, thanks to goose, kita bisa membuat file binary yang dapat dijadikan sebagai tool migrasi kita. Sehingga setiap user yang memiliki source code, tidak perlu lagi melakukan manual migrasi SQL dengan cara mengeksekusi file SQL melalui Database Management tools seperti PHPMyAdmin, PGAdmin, Datagrip, ataupun MySQLWorkbench.

Step membuat file migrasi

Setelah kita install dependency goose, kita eksekusi file binary nya yang terletak di (linux : $GOROOT/bin)

Kita eksekusi file tersebut didalam root folder project atau di folder ./db di project kita. (Ini bebas, namun saya prefer membuat folder db yang gunanya untuk menyimpan file-file migrasi

*penting! Jika ada foreign key pada DDL, pastikan generate table yang independent terlebih dahulu

  1. Buat file migrasi .sql untuk table users
$: ~/go/bin/goose create Users sql

2. Buat file migrasi .sql untuk table roles

$: ~/go/bin/goose create Roles sql

3. Buat file migrasi .sql untuk table user_roles

$: ~/go/bin/goose create UserRoles sql

Nanti, akan di hasilkan 3 file berikut:

Untuk prefix nya seperti 20200809002448, belum tentu sama di komputer saudara. Karena itu adalah timestamp ketika dibuatnya file migration.

Isi dari file migration seperti berikut:

Masih kosong, tapi sangat straight forward. Artinya, dibawah komentar bagian +goose Up, kita isi SQL Statement / DDL yang ingin kita execute (seperti membuat table, menambah data, dll), sedangkan dibawah bagian +goose Down kita isi SQL Statement / DDL yang kita ingin execute ketika proses pembersihan (seperti drop table, truncate, dll)

Kita copy kan schema kita ke dalam file yang telah digenerate goose

Buat file goose.go

goose.go akan di compile menjadi file binary yang nantinya akan melakukan proses migrasi. Sehingga user lain tidak perlu menginstall dependency goose di perangkat mereka. Nantinya kita cukup berikan file binary ini beserta file migration sql nya

Berikut struktur folder sampai saat ini:

Karena saya menggunakan Go Module, jadi ada tambahan file go.mod dan go.sum

Lalu kita compile goose.go nya

go build goose.go

Setelah itu, kita cek status migration dengan command

./goose postgres “user=<user-anda> password=<password-anda> dbname=postgres sslmode=disable” status

Applied at masih pending, artinya kita belum menerapkan migrasi. Untuk melakukan migrasi, ketik command ini

./goose postgres “user=<user-anda> password=<password-anda> dbname=postgres sslmode=disable” up

Heavens’s Brisket!, table-table yang kita define berhasil di migrate. Data-data inisial untuk table role pun otomatis ter insert

Summary

Di tutorial ini, kita telah belajar sedikit mengenai salah satu tool migrasi database di Golang bernama goose, kita juga sudah menggunakan 3 command dasar di goose yakni create, status dan up. Dan yang terpenting, kita telah berhasil membuat file binary yang bersifat standalone sebagai tool migrasi.

Ok. Sampai sini tutorialnya, Terima kasih.

My big thanks to :

Eugene Lisitsky https://stackoverflow.com/a/47050074/8642988

for providing the code

--

--

Gilang Prambudi

I prefer old-school song and technology, as they are obvious and more understandable.