<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arief Pasa Ibrahim</title>
    <description>The latest articles on DEV Community by Arief Pasa Ibrahim (@pashaibrhm).</description>
    <link>https://dev.to/pashaibrhm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1395005%2Fdcfcd352-4c88-4d70-b017-bac491fe091c.jpg</url>
      <title>DEV Community: Arief Pasa Ibrahim</title>
      <link>https://dev.to/pashaibrhm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pashaibrhm"/>
    <language>en</language>
    <item>
      <title>Belajar Flyway Episode 2: Cara Kerja Flyway dan Versioned Migrations</title>
      <dc:creator>Arief Pasa Ibrahim</dc:creator>
      <pubDate>Sat, 19 Apr 2025 09:22:22 +0000</pubDate>
      <link>https://dev.to/pashaibrhm/belajar-flyway-episode-2-cara-kerja-flyway-dan-versioned-migrations-5e09</link>
      <guid>https://dev.to/pashaibrhm/belajar-flyway-episode-2-cara-kerja-flyway-dan-versioned-migrations-5e09</guid>
      <description>&lt;p&gt;Halo! Selamat datang di Episode 2 dari seri belajar Flyway. Di episode sebelumnya kita sudah berkenalan dengan Flyway secara umum, yang teman-teman bisa baca ulang disini, ya (&lt;a href="https://dev.to/pashaibrhm/belajar-flyway-episode-1-pengenalan-dan-migrasi-pertama-45hd"&gt;Belajar Flyway Episode 1: Pengenalan dan Migrasi Pertama&lt;/a&gt;). Nah, pada episode kali ini kita akan membahas lebih dalam tentang &lt;strong&gt;cara kerja Flyway&lt;/strong&gt;, terutama mengenai &lt;strong&gt;versioned migrations&lt;/strong&gt; (migrasi berversi). Kita juga akan melihat &lt;strong&gt;bagaimana Flyway mengeksekusi file migrasi&lt;/strong&gt; berprefix &lt;code&gt;V__&lt;/code&gt;, &lt;strong&gt;bagaimana Flyway menyimpan histori migrasi di database&lt;/strong&gt;, serta sekilas perbedaan antara &lt;strong&gt;versioned vs. repeatable migrations&lt;/strong&gt;. Gaya pembahasannya akan santai dan seperti ngobrol langsung, supaya mudah diikuti. Yuk, kita mulai!&lt;/p&gt;

&lt;h2&gt;
  
  
  Cara Kerja Flyway Secara Umum
&lt;/h2&gt;

&lt;p&gt;Flyway adalah sebuah tool open-source untuk &lt;strong&gt;mengelola migrasi database&lt;/strong&gt; dengan konsep versioning. Cara kerjanya cukup straight-forward: Flyway akan memindai (scan) lokasi file migrasi yang sudah kita tentukan (misalnya folder &lt;code&gt;classpath:db/migration&lt;/code&gt; di proyek Java kita) dan membandingkan dengan catatan migrasi yang sudah diterapkan di database. Jika ditemukan perbedaan (ada migrasi baru yang belum pernah dijalankan), Flyway akan menjalankan skrip migrasi tersebut untuk “menutup gap” perbedaan versi antara struktur database dan kode aplikasi. Proses menjalankan perintah migrasi (&lt;code&gt;flyway migrate&lt;/code&gt;) ini bersifat &lt;strong&gt;idempotent&lt;/strong&gt;, artinya aman dijalankan berulang kali; jika tidak ada migrasi baru, Flyway tidak akan mengubah apa-apa.&lt;/p&gt;

&lt;p&gt;Sebagai contoh, misalkan saat ini database kita ada di &lt;strong&gt;versi 5&lt;/strong&gt; (artinya migrasi terakhir yang terpasang bernomor 5), dan di folder migrasi tersedia file hingga &lt;strong&gt;V9&lt;/strong&gt;. Ketika Flyway dijalankan, ia akan menerapkan migrasi versi 6, 7, 8, dan 9 secara berurutan ke database. Sebaliknya, jika database sudah up-to-date (sudah di versi 9 dan tidak ada file migrasi baru), Flyway tidak akan melakukan apa-apa. Dengan mekanisme ini, Flyway memastikan skema database selalu &lt;em&gt;sync&lt;/em&gt; dengan ekspektasi aplikasi di manapun kita menjalankannya (development, staging, produksi, dll).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tip: Biasanya Flyway dijalankan otomatis saat startup aplikasi (misalnya di aplikasi Spring Boot dengan PostgreSQL, migrasi akan berjalan ketika aplikasi dijalankan). Hal ini memastikan setiap instance aplikasi berjalan dengan skema database yang sesuai dengan versi kodenya, jadi tidak ada error karena perbedaan struktur. Tentu, Flyway juga bisa dijalankan manual via command line atau plugin build (Maven/Gradle) tergantung kebutuhan.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Konsep Versioned Migration (Migrasi Berversi)
&lt;/h2&gt;

&lt;p&gt;Salah satu konsep inti Flyway adalah &lt;strong&gt;versioned migrations&lt;/strong&gt;. Ini adalah skrip migrasi yang &lt;strong&gt;memiliki nomor versi unik&lt;/strong&gt; di namanya, dieksekusi &lt;strong&gt;sekali saja&lt;/strong&gt; dan secara berurutan sesuai urutan versinya. Begitu migrasi dengan versi tertentu dijalankan dan dicatat, Flyway tidak akan menjalankannya lagi di masa mendatang (kecuali kita mengubah versinya atau menghapus catatan historinya secara manual).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Penamaan file migrasi berversi&lt;/strong&gt; biasanya mengikuti format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;V&amp;lt;versi&amp;gt;__&amp;lt;Deskripsi&amp;gt;.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Contoh nama file: &lt;code&gt;V1__Initial_setup.sql&lt;/code&gt;, &lt;code&gt;V2__Add_users_table.sql&lt;/code&gt;, &lt;code&gt;V2.1__Update_user_role.sql&lt;/code&gt; dll.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prefix &lt;code&gt;V&lt;/code&gt; menandakan &lt;strong&gt;versioned migration&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Setelah itu diikuti nomor versi (boleh berupa integer berurutan atau format penomoran berjenjang dengan titik).&lt;/li&gt;
&lt;li&gt;Lalu dua garis bawah &lt;code&gt;__&lt;/code&gt; sebagai pemisah, diikuti deskripsi singkat mengenai migrasinya.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Flyway akan &lt;strong&gt;mengurutkan file-file migrasi tersebut berdasarkan nomornya&lt;/strong&gt; secara numerik dan menjalankannya sesuai urutan tersebut. Penting bahwa &lt;strong&gt;setiap file migrasi memiliki versi yang unik&lt;/strong&gt;; Flyway akan mendeteksi jika ada duplikat versi dan akan menolak menjalankan migrasi yang konflik. Versi bisa berbentuk angka sederhana (1, 2, 3, ...) atau format bertitik (1.1, 1.2, 2.0, dst) sesuai kebutuhan, asalkan urut secara logis. Deskripsi setelah &lt;code&gt;__&lt;/code&gt; tidak berpengaruh ke proses (hanya untuk membantu kita mengingat tujuan migrasi), sedangkan ekstensi file biasanya &lt;code&gt;.sql&lt;/code&gt; untuk migrasi SQL (Flyway juga mendukung migrasi berbasis Java, tapi umumnya kita pakai SQL saja).&lt;/p&gt;

&lt;p&gt;Setelah skrip versioned migration diterapkan di satu lingkungan (terutama lingkungan production atau staging yang sifatnya permanen), &lt;strong&gt;best practice&lt;/strong&gt;-nya adalah &lt;em&gt;tidak mengubah isi skrip tersebut lagi&lt;/em&gt;. Kenapa? Karena Flyway menyimpan checksum (hash) dari file migrasi yang sudah dijalankan. Jika kita mengedit file yang sudah terekap di history, Flyway akan mendeteksi checksum-nya tidak cocok saat berikutnya dijalankan dan menandainya sebagai konflik. Solusinya, apabila perlu perubahan skema lagi, cukup buat file migrasi baru dengan nomor versi berikutnya untuk melakukan perubahan tersebut (strategi &lt;strong&gt;roll-forward&lt;/strong&gt; daripada mengubah yang sudah ada). Dengan demikian, riwayat migrasi tetap konsisten dan mudah di-trace kapan perubahan tertentu diperkenalkan.&lt;/p&gt;

&lt;p&gt;Versioned migration umumnya dipakai untuk perubahan yang &lt;em&gt;incremental&lt;/em&gt;, misalnya: membuat/ mengubah/ menghapus tabel, menambah kolom baru, membuat index, mengubah data referensi, atau koreksi data spesifik. Intinya, semua perubahan yang ingin kita terapkan sekali saja dan versi selanjutnya akan bertumpu di atas perubahan tersebut, sebaiknya diformat sebagai versioned migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Alur Eksekusi File Versi (V__*) oleh Flyway
&lt;/h2&gt;

&lt;p&gt;Sekarang kita bahas &lt;strong&gt;bagaimana Flyway mengeksekusi file-file migrasi&lt;/strong&gt; berprefix &lt;code&gt;V&lt;/code&gt; tersebut. Berikut adalah alur umum setiap kali kita menjalankan perintah migrasi Flyway (misal dengan menjalankan &lt;code&gt;Flyway.migrate()&lt;/code&gt; di kode Java atau perintah &lt;code&gt;flyway migrate&lt;/code&gt; di CLI):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scanning/Pencarian Skrip:&lt;/strong&gt; Flyway akan mencari semua file migrasi di lokasi yang sudah dikonfigurasi. Secara default, Flyway mencari di folder &lt;code&gt;filesystem:src/main/resources/db/migration&lt;/code&gt; (jika menggunakan integrasi Spring Boot, cukup letakkan file di &lt;code&gt;resources/db/migration&lt;/code&gt;). Flyway memuat semua file yang nama depannya sesuai konvensi (misal dia akan pilih semua file yang diawali &lt;code&gt;V&lt;/code&gt; untuk versioned dan &lt;code&gt;R&lt;/code&gt; untuk repeatable sesuai aturan nama).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Membandingkan dengan History:&lt;/strong&gt; Setelah daftar file migrasi didapat, Flyway akan &lt;strong&gt;membaca tabel histori migrasi di database&lt;/strong&gt; (nanti kita bahas detail tabel ini). Dari situ, Flyway tahu &lt;strong&gt;versi terakhir&lt;/strong&gt; yang sudah diterapkan di database serta daftar semua migrasi (beserta checksum-nya) yang pernah dijalankan. File migrasi yang &lt;strong&gt;belum ada catatannya di history&lt;/strong&gt; berarti dianggap &lt;em&gt;pending&lt;/em&gt; (belum pernah dijalankan). Sebagai contoh, jika di history terakhir adalah versi 5, maka file &lt;code&gt;V6__...sql&lt;/code&gt; ke atas akan dianggap pending. Flyway juga akan mendeteksi kalau ada file baru dengan versi lebih rendah dari versi terakhir (misal mendadak ada &lt;code&gt;V4__...sql&lt;/code&gt; padahal DB sudah versi 5) – kasus seperti ini umumnya dianggap error karena versinya out-of-order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Menjalankan Migrasi Pending:&lt;/strong&gt; Flyway kemudian mengeksekusi semua &lt;strong&gt;versioned migration yang pending&lt;/strong&gt; tersebut &lt;strong&gt;secara berurutan&lt;/strong&gt; menurut urutan versinya. Eksekusi ini biasanya dilakukan dalam transaksi. Misalnya, pertama dijalankan skrip &lt;code&gt;V6__...sql&lt;/code&gt;, selesai sukses, lanjut &lt;code&gt;V7__...sql&lt;/code&gt;, dan seterusnya. Jika ada satu skrip gagal di tengah jalan (contoh: perintah SQL di dalamnya error), Flyway akan menghentikan proses migrasi dan (jika database mendukung) melakukan rollback transaksi migrasi yang gagal tersebut, sehingga database tidak setengah-setengah ke-update. Kita harus memperbaiki error tersebut dahulu sebelum menjalankan migrate lagi.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mencatat Hasil ke Tabel History:&lt;/strong&gt; Setiap kali satu file migrasi berhasil dijalankan, Flyway akan &lt;strong&gt;menyisipkan sebuah record ke tabel histori&lt;/strong&gt; migrasi di database. Record ini mencatat versi berapa yang dijalankan, nama file apa, checksum file, waktu eksekusi, siapa yang menjalankan, durasi, dan status sukses. Dengan pencatatan ini, Flyway mengingat bahwa versi tersebut sudah ter-install. Jika nanti kita menjalankan migrasi lagi, versi ini tidak akan dieksekusi ulang (kecuali dihapus dari tabel history secara manual atau dilakukan &lt;strong&gt;repair&lt;/strong&gt; khusus).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeatable Migrations (Opsional):&lt;/strong&gt; Setelah semua migrasi versi (V) yang pending selesai, Flyway akan melanjutkan menjalankan &lt;strong&gt;repeatable migrations&lt;/strong&gt; (file &lt;code&gt;R__...sql&lt;/code&gt;) jika ada. Repeatable migration yang dijalankan hanyalah yang &lt;strong&gt;belum pernah dicatat&lt;/strong&gt; di history &lt;em&gt;atau&lt;/em&gt; yang isi file-nya berubah (checksum-nya berbeda dari catatan sebelumnya). Semua repeatable migration dijalankan &lt;strong&gt;paling akhir&lt;/strong&gt; dalam satu batch migrasi, urut berdasarkan nama/deskripsi file (secara alfabetis). (Kita akan bahas repeatable migration sebentar lagi di bagian berikutnya.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Selesai:&lt;/strong&gt; Pada titik ini, Flyway telah menerapkan semua perubahan yang diperlukan. Database kini berada di versi terbaru sesuai skrip-skrip migrasi yang ada. Jika kita tambahkan skrip migrasi baru di kemudian hari, proses di atas akan berulang: Flyway akan mendeteksi ada versi baru yang pending, lalu menjalankannya.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Langkah-langkah di atas terjadi di balik layar setiap kali kita melakukan migrasi. Sebagai pengguna, kita biasanya cukup menulis skrip SQL migrasi sesuai aturan penamaan, menaruhnya di folder yang tepat, lalu memicu Flyway (baik dengan menjalankan aplikasi Java, melalui Maven/Gradle plugin, atau perintah CLI). Flyway yang akan mengurus sisanya secara otomatis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Flyway Schema History: Menyimpan Riwayat Migrasi di Database
&lt;/h2&gt;

&lt;p&gt;Untuk &lt;strong&gt;melacak migrasi&lt;/strong&gt; apa saja yang sudah dijalankan, Flyway menggunakan sebuah tabel khusus di database. Secara default nama tabelnya adalah &lt;code&gt;flyway_schema_history&lt;/code&gt; (dulunya pada Flyway versi lama disebut &lt;code&gt;schema_version&lt;/code&gt;). Tabel ini akan otomatis dibuat di &lt;strong&gt;schema&lt;/strong&gt; database yang kita migrasi ketika Flyway pertama kali menjalankan migrasi ke database tersebut.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhsxafbybxcbrq83cw1ay.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhsxafbybxcbrq83cw1ay.webp" alt="Tabel *flyway_schema_history* menyimpan histori dari setiap migrasi yang pernah dijalankan." width="800" height="74"&gt;&lt;/a&gt;&lt;br&gt;
Gambar di atas menunjukkan contoh isi tabel history setelah menjalankan dua migrasi versioned (versi 1 dan 2). Terlihat ada beberapa kolom penting: &lt;strong&gt;installed_rank&lt;/strong&gt; (nomor urut instalasi migrasi), &lt;strong&gt;version&lt;/strong&gt; (versi migrasi yang dijalankan), &lt;strong&gt;description&lt;/strong&gt; (deskripsi migrasi sesuai nama file), &lt;strong&gt;type&lt;/strong&gt; (tipe migrasi, misal &lt;code&gt;SQL&lt;/code&gt;), &lt;strong&gt;script&lt;/strong&gt; (nama file skrip migrasi yang dijalankan), &lt;strong&gt;checksum&lt;/strong&gt; (angka hash untuk mendeteksi perubahan file), &lt;strong&gt;installed_by&lt;/strong&gt; (user yang menjalankan migrasi, di sini user DB &lt;code&gt;postgres&lt;/code&gt;), &lt;strong&gt;installed_on&lt;/strong&gt; (timestamp kapan migrasi dijalankan), &lt;strong&gt;execution_time&lt;/strong&gt; (waktu eksekusi dalam milidetik), dan &lt;strong&gt;success&lt;/strong&gt; (status berhasil atau tidaknya migrasi tersebut).&lt;/p&gt;

&lt;p&gt;Setiap kali Flyway menjalankan migrasi baru, ia akan menambahkan baris baru ke tabel ini. Dengan adanya &lt;em&gt;flyway_schema_history&lt;/em&gt;, Flyway dapat &lt;strong&gt;mengetahui versi terakhir&lt;/strong&gt; dari database serta memastikan skrip yang sama tidak dijalankan dua kali. Misalnya, jika kita sudah punya entri untuk &lt;code&gt;version = 2&lt;/code&gt; di tabel history, lalu kita jalankan Flyway lagi, ia tahu versi 2 sudah ada dan tidak perlu menjalankan ulang &lt;code&gt;V2__...sql&lt;/code&gt;. Selain itu, Flyway juga menyimpan &lt;strong&gt;checksum&lt;/strong&gt; dari file pada saat migrasi dijalankan. Jika file migrasi diubah setelah penerapan, checksum-nya akan berbeda dengan catatan di history dan Flyway akan menganggap itu masalah (terdeteksi sebagai perubahan tak diinginkan). Hal ini berguna untuk mencegah seseorang mengedit migrasi yang sudah berjalan di production secara diam-diam – integritas migrasi terjaga.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Catatan: Jika kita terpaksa mengubah skrip migrasi yang sudah telanjur berjalan (misal ada koreksi minor di lingkungan development), Flyway menyediakan perintah repair untuk menyesuaikan kembali catatan di tabel history (misalnya memperbarui checksum). Namun, hal ini sebaiknya dihindari di environment production; lebih baik buat migrasi baru untuk perubahan apapun daripada mengedit sejarah.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Perbedaan Versioned vs. Repeatable Migrations
&lt;/h2&gt;

&lt;p&gt;Terakhir, mari bahas singkat perbedaan antara &lt;strong&gt;versioned&lt;/strong&gt; dan &lt;strong&gt;repeatable&lt;/strong&gt; migrations di Flyway. Sejauh ini kita fokus di migrasi berversi (&lt;code&gt;V__&lt;/code&gt;). Flyway juga mendukung migrasi &lt;em&gt;repeatable&lt;/em&gt; (&lt;code&gt;R__&lt;/code&gt;). Berikut perbedaan utamanya:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Versioned Migration (V):&lt;/strong&gt; Memiliki &lt;strong&gt;nomor versi unik&lt;/strong&gt; di nama filenya. Migrasi ini dijalankan &lt;strong&gt;sekali saja&lt;/strong&gt; per database. Setelah dijalankan, dianggap final dan tidak akan dijalankan lagi di run berikutnya (Flyway tahu sudah &lt;em&gt;done&lt;/em&gt; lewat tabel history). Jika ada perubahan skema baru, kita membuat file migrasi versioned &lt;em&gt;baru&lt;/em&gt; dengan versi berikutnya. Versioned migration digunakan untuk perubahan yang sifatnya increment (naik versi terus-menerus).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repeatable Migration (R):&lt;/strong&gt; &lt;strong&gt;Tidak memiliki nomor versi&lt;/strong&gt;, hanya prefix &lt;code&gt;R&lt;/code&gt; dan deskripsi. Migrasi ini bisa dijalankan &lt;strong&gt;berulang kali&lt;/strong&gt; apabila ada perubahan isinya. Flyway menentukan perlu tidaknya menjalankan repeatable migration dengan cara memeriksa &lt;strong&gt;checksum&lt;/strong&gt;: setiap kali perintah migrate dijalankan, Flyway akan menjalankan ulang file &lt;code&gt;R__...sql&lt;/code&gt; &lt;em&gt;jika dan hanya jika&lt;/em&gt; checksum file tersebut berubah dibanding catatan terakhir di history, atau jika file tersebut belum pernah dijalankan sebelumnya. Repeatable migration &lt;strong&gt;selalu dijalankan setelah semua versioned migration selesai&lt;/strong&gt; dalam satu batch migrasi, dan jika ada beberapa repeatable, urutannya berdasarkan alfabet (berdasarkan nama/deskripsi file). Jenis migrasi ini berguna untuk hal-hal yang mungkin perlu diperbarui secara teratur atau di-recreate, misalnya definisi &lt;strong&gt;view&lt;/strong&gt;, &lt;strong&gt;stored procedure&lt;/strong&gt;, &lt;strong&gt;function&lt;/strong&gt;, atau seeding ulang data referensi. Kita bisa menulis script repeatable misalnya &lt;code&gt;R__Refresh_all_views.sql&lt;/code&gt; yang berisi perintah &lt;code&gt;CREATE OR REPLACE VIEW ...&lt;/code&gt; sehingga aman dijalankan berulang kali. Setiap kali file ini berubah (misal view diubah), Flyway akan re-run script ini di semua environment yang menjalankan migrate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Singkatnya, &lt;strong&gt;versioned migration&lt;/strong&gt; itu seperti langkah versi yang linier dan hanya sekali jalan, sedangkan &lt;strong&gt;repeatable migration&lt;/strong&gt; itu seperti skrip yang bisa dijalankan berulang jika diperlukan. Keduanya dicatat di tabel history (repeatable punya entri version kosong tapi ada checksum). Dalam praktiknya, sebagian besar migrasi schema akan kita tulis sebagai versioned migration. Repeatable migration dipakai saat diperlukan saja.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Contoh situasi penggunaan repeatable: Kita punya beberapa SQL untuk membuat laporan (view) yang kompleks. Daripada membuat version baru tiap kali view diubah, kita bisa simpan sebagai R__ script. Setiap ada perubahan, cukup ubah file itu, lalu Flyway akan mendeteksi perubahan dan menerapkannya.)&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;Demikianlah pembahasan kita di Episode 2 tentang cara kerja Flyway, versioned migrations, alur eksekusi migrasi oleh Flyway, penyimpanan histori migrasi, dan perbedaan versioned vs repeatable migration. Semoga penjelasannya mudah dimengerti. Dengan pemahaman ini, kita jadi tahu &lt;strong&gt;apa yang terjadi di balik layar&lt;/strong&gt; saat Flyway melakukan migrasi database. Di episode berikutnya, kemungkinan kita akan coba &lt;strong&gt;contoh implementasi Flyway&lt;/strong&gt; dalam proyek Java dengan PostgreSQL, jadi pastikan untuk tetap mengikuti seri ini. Terima kasih sudah menyimak, dan sampai jumpa!&lt;/p&gt;

</description>
      <category>database</category>
      <category>git</category>
      <category>flyway</category>
      <category>programming</category>
    </item>
    <item>
      <title>Belajar Flyway Episode 1: Pengenalan dan Migrasi Pertama</title>
      <dc:creator>Arief Pasa Ibrahim</dc:creator>
      <pubDate>Sun, 13 Apr 2025 14:49:46 +0000</pubDate>
      <link>https://dev.to/pashaibrhm/belajar-flyway-episode-1-pengenalan-dan-migrasi-pertama-45hd</link>
      <guid>https://dev.to/pashaibrhm/belajar-flyway-episode-1-pengenalan-dan-migrasi-pertama-45hd</guid>
      <description>&lt;h2&gt;
  
  
  Pendahuluan
&lt;/h2&gt;

&lt;p&gt;Halo teman-teman! Selamat datang di seri &lt;strong&gt;Belajar Flyway&lt;/strong&gt;. 🎉 Di episode pertama ini, kita akan berkenalan dengan &lt;strong&gt;Flyway&lt;/strong&gt;, sebuah tool untuk mengelola &lt;strong&gt;migrasi database&lt;/strong&gt;, dan langsung mencoba membuat migrasi pertama kita. Sebagai contoh, kita akan menggunakan &lt;strong&gt;PostgreSQL&lt;/strong&gt; sebagai database-nya.&lt;/p&gt;

&lt;p&gt;Sebagai developer, kamu pasti pernah menghadapi situasi di mana perlu mengubah struktur database seiring perkembangan aplikasi. Misalnya menambahkan kolom baru, membuat tabel tambahan, atau mengubah tipe data kolom. Kalau perubahan skema database ini dilakukan manual, bisa jadi sumber &lt;em&gt;error&lt;/em&gt; dan kebingungan. Bayangkan kalau ada beberapa environment (development, testing, production) atau tim yang berbeda; memastikan semua database punya skema yang sama itu &lt;strong&gt;rumit&lt;/strong&gt;. Nah, di sinilah Flyway bisa membantu kita mengelola perubahan-perubahan itu dengan rapi dan otomatis.&lt;/p&gt;

&lt;h2&gt;
  
  
  Apa itu Flyway?
&lt;/h2&gt;

&lt;p&gt;Flyway adalah &lt;strong&gt;open-source database migration tool&lt;/strong&gt; yang berfungsi layaknya &lt;em&gt;version control&lt;/em&gt; untuk skema database. Dengan Flyway, setiap perubahan pada struktur database kita simpan dalam file SQL terpisah yang diberi nomor versi. Ketika dijalankan, Flyway akan membaca urutan file-file migrasi tersebut dan menerapkannya ke database secara berurutan. Idenya mirip seperti Git untuk kode, tapi ini untuk database: jadi kita bisa melacak perubahan skema dari waktu ke waktu.&lt;/p&gt;

&lt;p&gt;Beberapa hal keren tentang Flyway:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mudah digunakan:&lt;/strong&gt; Kita cukup menulis skrip SQL untuk perubahan (misalnya &lt;code&gt;CREATE TABLE&lt;/code&gt; atau &lt;code&gt;ALTER TABLE&lt;/code&gt;), lalu Flyway yang akan menjalankan skrip tersebut ke database. Tidak perlu nulis kode Java/Python khusus untuk migrasi (meskipun Flyway mendukung migrasi berbasis code juga, tapi yang umum ya pakai SQL biasa).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versioning:&lt;/strong&gt; Setiap skrip migrasi dikasih versi (misal V1, V2, dst). Flyway memastikan migrasi dijalankan sesuai urutan versinya. Ia juga mencegah skrip yang sama dijalankan dua kali di database yang sama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Konsisten di berbagai environment:&lt;/strong&gt; Mau di laptop developer, server staging, atau production, skema database bisa dibuat konsisten cukup dengan menjalankan migrasi via Flyway. Jadi "apa yang sudah di-dev akan sama dengan yang di-prod" selama semua pakai migrasi yang sama.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mendukung banyak database:&lt;/strong&gt; Flyway bisa dipakai dengan PostgreSQL, MySQL, MariaDB, Oracle, SQL Server, &lt;strong&gt;bahkan SQLite&lt;/strong&gt; dan database lainnya. Jadi skill yang kita pelajari di sini bisa diterapkan ke DB lain juga.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mudah diintegrasikan:&lt;/strong&gt; Flyway CLI bisa dijalankan via command line, dan juga ada plugin untuk Maven/Gradle, bahkan integrasi di Spring Boot otomatis. Di episode ini kita fokus dulu ke penggunaan via CLI biar konsep dasarnya jelas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Intinya, Flyway membantu kita mengelola perubahan database secara &lt;strong&gt;terstruktur, otomatis, dan aman&lt;/strong&gt;. Daripada ingat-ingat "udah bikin tabel X belum ya di server si A?", kita tinggal cek catatan migrasi Flyway. 👍&lt;/p&gt;

&lt;h2&gt;
  
  
  Alur Kerja Dasar Flyway
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2h9uqdzmjndgw07n3hk6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2h9uqdzmjndgw07n3hk6.png" alt="*Gambar ilustrasi: Alur kerja dasar Flyway.*" width="612" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Gambar ilustrasi: Alur kerja dasar Flyway.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pada ilustrasi di atas, kita bisa melihat alur sederhana cara Flyway bekerja. Developer menyimpan &lt;strong&gt;file-file SQL migrasi&lt;/strong&gt; di folder khusus (misalnya folder &lt;strong&gt;migrations&lt;/strong&gt; di proyek). Kemudian saat dijalankan, &lt;strong&gt;Flyway CLI&lt;/strong&gt; akan membaca file-file tersebut dan menerapkan perubahan skema yang tertulis ke &lt;strong&gt;database&lt;/strong&gt; target. Setiap kali sebuah migrasi diterapkan, Flyway akan &lt;strong&gt;menambahkan entri ke tabel history&lt;/strong&gt; di database. Dengan mekanisme ini, Flyway selalu tahu migrasi mana saja yang sudah atau belum dijalankan pada suatu database, mirip seperti catatan versi. Hasilnya, kondisi skema database dapat dijaga konsisten di berbagai environment secara otomatis dan terkontrol.&lt;/p&gt;

&lt;p&gt;Manfaat utama menggunakan Flyway antara lain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Versi Terpusat:&lt;/strong&gt; Perubahan skema tersimpan dalam skrip versi yang terorganisir. Tidak ada lagi skrip SQL tercecer di chat atau email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Konsistensi Antar Environment:&lt;/strong&gt; Setiap environment bisa dijaga agar memiliki struktur database yang sama. Flyway memastikan migrasi diterapkan urut sesuai versi di dev, test, hingga production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Otomatis &amp;amp; Mudah Dilacak:&lt;/strong&gt; Cukup jalankan satu perintah untuk apply semua perubahan yang belum ada. Riwayat migrasi terekam, sehingga mudah dilihat dengan perintah info. Ini memberikan kepercayaan diri untuk deploy DB changes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kolaborasi Tim:&lt;/strong&gt; Mirip Git, tim bisa bekerja paralel mengedit database lewat migrasi. Konflik terdeteksi jika dua orang buat versi sama, dan bisa diselesaikan dengan menaikkan versi salah satu. Semua anggota tim dapat melihat daftar perubahan yang dilakukan rekan mereka (melalui repository kode migrasi).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dukungan Banyak Database:&lt;/strong&gt; Flyway mendukung hampir semua database relasional populer: dari MySQL, PostgreSQL, Oracle, SQL Server, hingga database embedded seperti H2 dan SQLite. Jadi kemungkinan besar apapun database yang kamu pakai, Flyway sudah kompatibel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dengan sederet manfaat di atas, Flyway menjadi salah satu tool migration paling populer saat ini. Prinsipnya sederhana tapi powerful: &lt;em&gt;reliable schema evolution&lt;/em&gt; – evolusi skema yang andal dan otomatis di semua environment kita. &lt;/p&gt;

&lt;h2&gt;
  
  
  Contoh Kasus
&lt;/h2&gt;

&lt;p&gt;Biar lebih kebayang, mari kita ambil contoh kasus sederhana. Misalkan kita ingin membuat aplikasi &lt;strong&gt;To-Do List&lt;/strong&gt;. Pada versi pertama aplikasi, kita mau menyimpan daftar tugas (tasks) dalam database. Kebutuhannya sederhana: kita butuh sebuah tabel &lt;code&gt;tasks&lt;/code&gt; dengan kolom-kolom dasar seperti &lt;code&gt;id&lt;/code&gt; dan &lt;code&gt;title&lt;/code&gt; (judul tugas). Mungkin juga kolom &lt;code&gt;completed&lt;/code&gt; untuk menandai apakah tugas sudah selesai atau belum.&lt;/p&gt;

&lt;p&gt;Awalnya, tanpa tool migrasi, mungkin kita akan langsung buat database dan jalankan perintah SQL &lt;code&gt;CREATE TABLE tasks ...&lt;/code&gt; secara manual. Oke, anggaplah di laptop kita sudah dibuat tabelnya. Lalu proyek berjalan, kamu menambahkan fitur baru yang butuh perubahan skema, misalnya kolom &lt;code&gt;due_date&lt;/code&gt; (tenggat waktu) di tabel &lt;code&gt;tasks&lt;/code&gt; atau membuat tabel baru untuk menyimpan kategori tugas. Kamu pun menjalankan ALTER TABLE atau CREATE TABLE baru di lokal.&lt;/p&gt;

&lt;p&gt;Masalah mulai muncul ketika &lt;strong&gt;tim lain&lt;/strong&gt; atau &lt;strong&gt;environment lain&lt;/strong&gt; butuh perubahan yang sama. Misal, si Budi yang kerja bareng kamu perlu database yang up-to-date dengan perubahan terbaru. Atau ketika mau deploy ke server, ternyata struktur database di server masih yang lama karena lupa menjalankan script SQL perubahan tadi. Akibatnya? Aplikasi error karena tabel/kolom yang dibutuhkan nggak ada di database server. 😵‍💫&lt;/p&gt;

&lt;p&gt;Dengan Flyway, alur kerja jadi lebih rapi. Setiap kali ada perubahan skema, kita buat &lt;strong&gt;file migrasi baru&lt;/strong&gt;. File ini (berupa SQL) disimpan di repository proyek (bersama kode aplikasi). Ketika tim lain menarik kode terbaru, mereka cukup menjalankan Flyway migrate, dan Flyway akan &lt;strong&gt;otomatis mendeteksi&lt;/strong&gt; migrasi mana yang belum ada di database mereka, lalu menjalankannya. Begitu pula saat deploy ke server: cukup jalankan migrasi, semua perubahan terapkan urut. Tidak ada lagi cerita "eh tabel X di DB staging belom dibuat ya?" karena semua tercatat.&lt;/p&gt;

&lt;p&gt;Jadi, Flyway sangat membantu untuk menjaga &lt;strong&gt;sinkronisasi&lt;/strong&gt; skema DB antara developer satu dengan yang lain, maupun antara environment. Kita akan langsung coba praktik membuat migrasi pertama untuk kasus To-Do List tadi: membuat tabel &lt;code&gt;tasks&lt;/code&gt; di PostgreSQL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalasi Flyway
&lt;/h2&gt;

&lt;p&gt;Sebelum membuat migrasi, kita perlu menyiapkan Flyway dan database PostgreSQL-nya. Berikut langkah-langkahnya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install Flyway CLI:&lt;/strong&gt; Download Flyway Community edition dari situs resmi Flyway (flywaydb.org). Flyway tersedia untuk Windows, Mac, dan Linux. Untuk Windows, kalian akan mendapat zip berisi &lt;code&gt;flyway.cmd&lt;/code&gt;; untuk Mac/Linux ada script &lt;code&gt;flyway&lt;/code&gt;. Silakan ekstrak file zip tersebut ke folder pilihanmu (misal: &lt;code&gt;C:\tools\flyway&lt;/code&gt; atau &lt;code&gt;~/flyway&lt;/code&gt;). Setelah ekstrak, di dalam folder Flyway seharusnya ada struktur seperti: folder &lt;code&gt;conf&lt;/code&gt;, &lt;code&gt;drivers&lt;/code&gt;, &lt;code&gt;sql&lt;/code&gt;, dan file executable &lt;code&gt;flyway&lt;/code&gt;. Agar gampang dipanggil, tambahkan folder tersebut ke PATH, atau pindah direktori ke situ saat mau menjalankan perintah.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Petunjuk dan langkah untuk instalasi pada Linux (Ubuntu):&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Ekstrak file yang diunduh dari website resmi.&lt;/span&gt;
&lt;span class="nb"&gt;sudo tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; ~/Downloads/FlywayDesktopLinuxX64_7.8.7.0.tar.gz

&lt;span class="c"&gt;# Pindahkan folder hasil ekstaksi ke folder opt&lt;/span&gt;
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; ~/Downloads/flyway /opt

&lt;span class="c"&gt;# Buat symlink untuk memudahkan penggunaan di terminal&lt;/span&gt;
&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /opt/flyway/flyway /usr/local/bin/flyway

&lt;span class="c"&gt;# Beri akses dan izin untuk flyway&lt;/span&gt;
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /opt/flyway/flyway

&lt;span class="c"&gt;# Cek apakah instalasi berhasil&lt;/span&gt;
flyway &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Contoh hasil dari perintah &lt;code&gt;flyway -v&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1dfufcpa2i4u2a15e25g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1dfufcpa2i4u2a15e25g.png" alt="Hasil dari flyway -v" width="458" height="356"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Siapkan database PostgreSQL:&lt;/strong&gt; Pastikan kalian punya akses ke server PostgreSQL. Kamu bisa pakai PostgreSQL yang terinstall lokal di komputer, atau paling gampang gunakan Docker untuk menjalankan Postgres sementara. Misalnya, kalau pakai Docker bisa dengan perintah:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Buat container untuk postgresql&lt;/span&gt;
docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; postgres-belajar-flyway &lt;span class="nt"&gt;-p&lt;/span&gt; 5432:5432 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgres &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;belajar_flyway &lt;span class="se"&gt;\&lt;/span&gt;
    postgres:16
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Perintah di atas akan menjalankan container PostgreSQL latest di port 5432, dengan password user &lt;code&gt;postgres&lt;/code&gt; diset ke "postgres", dan otomatis membuat database baru bernama &lt;code&gt;belajar_flyway&lt;/code&gt;. &lt;strong&gt;Optional:&lt;/strong&gt; Jika kamu sudah punya Postgres terinstall, kamu bisa bikin database baru manual (misal via &lt;code&gt;createdb belajar_flyway&lt;/code&gt; atau pakai tool GUI) untuk percobaan ini. Tujuannya hanya agar kita punya database kosong tempat menjalankan migrasi, terpisah dari database lain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Konfigurasi koneksi Flyway:&lt;/strong&gt; Sekarang, beri tahu Flyway bagaimana menghubungkan ke database PostgreSQL tersebut. Buka file konfigurasi Flyway &lt;code&gt;flyway.conf&lt;/code&gt; yang ada di dalam folder &lt;code&gt;conf&lt;/code&gt; (bisa dibuka dengan text editor). Di dalamnya, cari dan edit bagian berikut:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flyway.url=jdbc:postgresql://localhost:5432/belajar_flyway
flyway.user=postgres
flyway.password=postgres
flyway.defaultSchema=flyway #skema yang digunakan flyway untuk track perubahan
flyway.createSchemas=true
flyway.locations=filesystem:/opt/flyway/sql #buat folder ini jika belum ada
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Penjelasan:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;flyway.url&lt;/strong&gt;: URL JDBC untuk konek ke database. Sesuaikan nama host/port/database dengan environment kamu. Contoh di atas mengasumsikan Postgres jalan di lokal (&lt;code&gt;localhost&lt;/code&gt;) port default 5432, dan nama database-nya &lt;code&gt;belajar_flyway&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;flyway.user&lt;/strong&gt; dan &lt;strong&gt;flyway.password&lt;/strong&gt;: kredensial login ke database. Contoh di atas pakai user default &lt;code&gt;postgres&lt;/code&gt; dan password &lt;code&gt;postgres&lt;/code&gt; (sesuai yang kita set di langkah Docker tadi). Ubah jika kamu pakai user atau password lain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;flyway.locations&lt;/strong&gt;: lokasi folder tempat menyimpan file-file migrasi. Secara default, Flyway pakai folder &lt;code&gt;filesystem:sql&lt;/code&gt;, yang artinya folder &lt;code&gt;sql&lt;/code&gt; di dalam direktori Flyway. Kita bisa pakai default ini untuk mempermudah (nanti kita simpan file migrasi di folder &lt;code&gt;sql&lt;/code&gt; tersebut).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Simpan perubahan di file config. Sekarang Flyway siap terhubung ke database Postgres kita. &lt;strong&gt;Catatan:&lt;/strong&gt; Menyimpan password DB di file konfigurasi kadang kurang aman. Alternatifnya, kamu bisa menghapus baris password dari config dan sebagai gantinya ekspor ENV &lt;code&gt;FLYWAY_PASSWORD&lt;/code&gt; saat mau menjalankan (atau gunakan parameter &lt;code&gt;-password=&lt;/code&gt; di CLI). Tapi untuk simplicity dalam belajar, kita taruh saja di file config lokal (jangan commit file ini ke repo publik ya, kalau ada password asli 😁).&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Sampai langkah ini, kita sudah menginstall Flyway dan mengkonfigurasi koneksi ke PostgreSQL. Waktunya membuat migrasi pertama!&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrasi Pertama
&lt;/h2&gt;

&lt;p&gt;Sekarang kita akan membuat migrasi pertama: membuat tabel &lt;code&gt;tasks&lt;/code&gt; di database. Ini sesuai contoh kasus To-Do List kita. Berikut langkah-langkahnya:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Buat file migrasi pertama:&lt;/strong&gt; Masuk ke folder &lt;code&gt;sql&lt;/code&gt; di direktori Flyway, lalu buat file baru untuk migrasi. Flyway memakai konvensi penamaan file migrasi dengan awalan &lt;strong&gt;V&lt;/strong&gt; diikuti nomor versi, dua underscore &lt;code&gt;__&lt;/code&gt;, lalu nama deskriptif. Karena ini migrasi pertama kita, beri nama filenya: &lt;strong&gt;&lt;code&gt;V1__create_tasks_table.sql&lt;/code&gt;&lt;/strong&gt;. (Gunakan underscore untuk spasi di nama file, dan hindari karakter aneh supaya Flyway bisa baca dengan benar.)&lt;/p&gt;

&lt;p&gt;Isi file &lt;code&gt;V1__create_tasks_table.sql&lt;/code&gt; dengan perintah SQL untuk membuat tabel &lt;code&gt;tasks&lt;/code&gt;. Misalnya seperti ini:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;completed&lt;/span&gt; &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;FALSE&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Kita membuat tabel &lt;code&gt;tasks&lt;/code&gt; dengan kolom: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;id&lt;/strong&gt; – sebagai primary key, tipe SERIAL (integer auto-increment di Postgres).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;title&lt;/strong&gt; – judul tugas, tipe VARCHAR(255) dan tidak boleh null (wajib diisi).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;completed&lt;/strong&gt; – status apakah tugas sudah selesai, tipe BOOLEAN dengan default FALSE (belum selesai).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Silakan simpan file tersebut. Inilah "skrip migrasi" pertama kita, versi V1. Karena baru pertama, isinya hanya create table. Kalau nanti ada perubahan lagi, kita akan buat V2, V3, dan seterusnya di file terpisah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Jalankan perintah migrasi dengan Flyway:&lt;/strong&gt; Sekarang saatnya menerapkan perubahan ke database. Buka terminal/command prompt, lalu navigasi ke direktori instalasi Flyway (tempat file &lt;code&gt;flyway&lt;/code&gt; berada). Pastikan file config sudah di-edit sesuai langkah sebelumnya. Kemudian jalankan perintah berikut:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flyway migrate
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Perintah di atas akan memerintahkan Flyway untuk menjalankan migrasi. Flyway akan membaca konfigurasi (URL, user, dll), mencari file-file migrasi di folder &lt;code&gt;sql&lt;/code&gt;, lalu mengeksekusi migrasi yang belum pernah dijalankan. Karena ini pertama kali, Flyway akan menjalankan file &lt;code&gt;V1__create_tasks_table.sql&lt;/code&gt;. Kamu akan melihat output di console yang kira-kira seperti berikut:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Flyway Community Edition 9.x.x by Redgate
Database: jdbc:postgresql://localhost:5432/belajar_flyway (PostgreSQL 16)
Successfully validated 1 migration (execution time 00:00.012s)
Creating Schema History table "flyway"."flyway_schema_history" ...
Current version of schema "flyway": &amp;lt;&amp;lt; Empty Schema &amp;gt;&amp;gt;
Migrating schema "flyway" to version 1 - Create tasks table
Successfully applied 1 migration to schema "flyway" (execution time 00:00.045s)
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Penjelasan output di atas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flyway terkoneksi ke database &lt;code&gt;belajar_flyway&lt;/code&gt; (PostgreSQL) kita.&lt;/li&gt;
&lt;li&gt;Flyway mem-validasi ada 1 file migrasi yang belum diterapkan.&lt;/li&gt;
&lt;li&gt;Karena pada setting sebelumnya kita sudah menentukan skema mana yang akan digunakan oleh Flyway, maka Flyway akan membuat tabel khusus bernama &lt;strong&gt;flyway_schema_history&lt;/strong&gt; di schema &lt;code&gt;flyway&lt;/code&gt;. Tabel ini dipakai Flyway untuk mencatat migrasi apa saja yang sudah dijalankan di database tersebut.&lt;/li&gt;
&lt;li&gt;Sebelumnya schema database kosong (Empty Schema), sekarang Flyway menjalankan migrasi versi 1 dengan deskripsi "Create tasks table".&lt;/li&gt;
&lt;li&gt;Setelah sukses, tertulis &lt;strong&gt;Successfully applied 1 migration&lt;/strong&gt;. Artinya, migrasi V1 kita berhasil diterapkan. 🎉&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika muncul output serupa tanpa error, selamat! Kamu sudah berhasil melakukan migrasi pertama dengan Flyway. Flyway telah membuat tabel &lt;code&gt;tasks&lt;/code&gt; sesuai SQL yang kita tulis, dan mencatatnya di tabel &lt;code&gt;flyway_schema_history&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tips: Kalau kamu menjalankan flyway migrate lagi sekarang, Flyway tidak akan mengulang migrasi V1 karena versi tersebut sudah ada di catatan flyway_schema_history. Flyway akan mengecek dan memberi tahu bahwa database sudah up-to-date (tidak ada migrasi baru yang perlu dijalankan). Ini penting supaya setiap migrasi hanya dieksekusi sekali saja di satu database.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Verifikasi
&lt;/h2&gt;

&lt;p&gt;Setelah menjalankan migrasi, kita perlu memverifikasi bahwa perubahan memang sudah masuk ke database. Ada beberapa cara untuk mengecek hasil migrasi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Menggunakan Flyway Info:&lt;/strong&gt; Flyway menyediakan perintah &lt;code&gt;flyway info&lt;/code&gt; yang menampilkan status migrasi di database. Coba jalankan &lt;code&gt;flyway info&lt;/code&gt; di terminal. Output-nya akan menampilkan tabel yang berisi daftar migrasi beserta statusnya (Applied/Pending). Kamu seharusnya melihat entry untuk &lt;strong&gt;Version 1 - Create tasks table&lt;/strong&gt; dengan status &lt;em&gt;Success/Installed&lt;/em&gt;. Di bagian "Current version of schema" kemungkinan tertera &lt;code&gt;1&lt;/code&gt; yang menandakan database sekarang di versi migrasi 1. Ini menegaskan bahwa skrip migrasi kita sudah tercatat dan diterapkan.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Cek langsung ke database:&lt;/strong&gt; Kamu bisa memastikan tabel &lt;code&gt;tasks&lt;/code&gt; benar-benar sudah dibuat di PostgreSQL. Jika kamu punya client psql (Postgres CLI) atau GUI database tool (misal PgAdmin, DBeaver, dll), coba konek ke database &lt;code&gt;belajar_flyway&lt;/code&gt; dan lihat daftar tabelnya. Contoh pakai &lt;strong&gt;psql&lt;/strong&gt; di terminal:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;psql &lt;span class="nt"&gt;-h&lt;/span&gt; localhost &lt;span class="nt"&gt;-U&lt;/span&gt; postgres &lt;span class="nt"&gt;-d&lt;/span&gt; belajar_flyway &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\d&lt;/span&gt;&lt;span class="s2"&gt;t"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Perintah di atas akan menampilkan list tabel di schema &lt;code&gt;public&lt;/code&gt;. Harusnya sekarang terlihat ada tabel &lt;strong&gt;tasks&lt;/strong&gt; dan tabel &lt;strong&gt;flyway_schema_history&lt;/strong&gt;. Kamu juga bisa cek struktur tabel &lt;code&gt;tasks&lt;/code&gt; dengan query &lt;code&gt;\d tasks&lt;/code&gt; (kalau di psql) atau dengan perintah SQL &lt;code&gt;SELECT * FROM tasks;&lt;/code&gt; (harusnya kosong karena kita baru buat tabelnya). Selain itu, coba lihat isi tabel &lt;code&gt;flyway_schema_history&lt;/code&gt; untuk memastikan ada record migrasi V1 di sana: &lt;code&gt;SELECT version, description, success FROM flyway_schema_history;&lt;/code&gt; akan menampilkan versi &lt;code&gt;1&lt;/code&gt;, deskripsi "Create tasks table", dan status sukses.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jika kedua cara di atas menunjukkan migrasi versi 1 sudah terpasang, berarti proses migrasi pertama kita &lt;strong&gt;berhasil&lt;/strong&gt;. 🎊 Sekarang database &lt;code&gt;belajar_flyway&lt;/code&gt; memiliki tabel &lt;code&gt;tasks&lt;/code&gt; sesuai yang kita inginkan, dan Flyway tahu bahwa migrasi V1 sudah diaplikasikan (sehingga tidak akan mengulangnya).&lt;/p&gt;




&lt;p&gt;Sampai di sini, kita telah menyelesaikan migrasi pertama kita menggunakan Flyway dengan PostgreSQL. Dari tidak ada tabel &lt;code&gt;tasks&lt;/code&gt;, sekarang tabel tersebut sudah ada berkat satu file migrasi dan satu perintah &lt;code&gt;flyway migrate&lt;/code&gt;. Gaya migrasi database seperti ini skalanya bisa berkembang seiring proyek berjalan: setiap ada perubahan baru, tinggal buat file migrasi baru (V2, V3, dst) dan jalankan Flyway lagi. Flyway akan menerapkan perubahan baru tersebut tanpa mengganggu yang sudah-sudah.&lt;/p&gt;

&lt;p&gt;Di episode selanjutnya, kita akan melanjutkan petualangan dengan Flyway: Belajar Flyway Episode 2: Cara Kerja Flyway dan Versioned Migrations. Tetap semangat belajar, dan happy coding! 🚀&lt;/p&gt;

</description>
      <category>database</category>
      <category>git</category>
      <category>flyway</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
