1. Pengenalan Atlas
Atlas adalah sebuah alat yang independen terhadap bahasa, dirancang khusus untuk mengelola dan memigrasikan skema basis data menggunakan prinsip-prinsip DevOps modern. Atlas menyediakan dua pilihan alur kerja:
- Deklaratif: Mirip dengan Terraform, Atlas membandingkan keadaan saat ini dari basis data dengan keadaan yang diinginkan yang didefinisikan menggunakan HCL, SQL, atau skema ORM. Berdasarkan perbandingan ini, Atlas menghasilkan dan menjalankan rencana migrasi untuk memindahkan basis data ke keadaan yang diinginkan.
- Versi: Berbeda dengan alat lain, Atlas secara otomatis merencanakan migrasi skema untuk Anda. Pengguna dapat mendeskripsikan skema basis data yang diinginkan menggunakan HCL, SQL, atau ORM pilihan mereka, lalu dengan Atlas, merencanakan, meninjau, dan menerapkan migrasi yang diperlukan ke basis data.
Salah satu keunggulan utama Atlas adalah penyederhanaannya terhadap kompleksitas pengelolaan basis data, menjadikannya mudah untuk kontrol versi, kolaborasi, dan implementasi.
2. Memasang Atlas
Sebelum menggunakan Atlas untuk mengelola versi basis data, kita perlu memasangnya. Berikut adalah langkah-langkah pemasangan untuk platform-platform berbeda.
2.1 Pemasangan pada macOS + Linux
Pada sistem macOS atau Linux, Anda dapat mengunduh dan memasang versi terbaru Atlas menggunakan baris perintah berikut:
curl -sSf https://atlasgo.sh | sh
Perintah ini akan secara otomatis mendeteksi versi sistem operasi, mengunduh versi build yang sesuai, dan menempatkan file biner Atlas di jalur eksekusi.
2.2 Memasang melalui Homebrew
Jika Anda menggunakan macOS dan sudah memasang manajer paket Homebrew, memasang Atlas sebegai berikut:
brew install ariga/tap/atlas
Ini akan mengambil versi terbaru Atlas dari repositori Homebrew dan memasangnya.
2.3 Pemasangan melalui Docker
Memasang dan menjalankan Atlas melalui Docker merupakan metode yang cepat dan nyaman, terutama untuk pengujian sementara atau untuk pengguna yang lebih suka tidak memasang perangkat lunak tambahan pada sistem host mereka.
Pertama, unduh gambar Docker Atlas:
docker pull arigaio/atlas
Kemudian, Anda dapat menjalankan perintah bantuan untuk memastikan pemasangan berhasil:
docker run --rm arigaio/atlas --help
Jika kontainer perlu mengakses jaringan host atau direktori lokal, gunakan flag --net=host
dan pasang direktori yang diperlukan:
docker run --rm --net=host \
-v $(pwd)/migrations:/migrations \
arigaio/atlas migrate apply \
--url "mysql://root:pass@:3306/test"
2.4 Pemasangan pada Windows
Unduh file biner, https://release.ariga.io/atlas/atlas-windows-amd64-latest.exe, dan tambahkan jalur pemasangan ke variabel lingkungan PATH sistem.
3. Mengekspor Struktur Tabel Database yang Ada Menggunakan Atlas
Atlas menyediakan perintah atlas schema inspect
, yang dapat digunakan untuk mengekspor struktur database yang sudah ada. Perintah ini mendukung membaca deskripsi database dari URL database dan mengeluarkannya dalam tiga format berbeda: format Atlas HCL default, format SQL, dan format JSON. Dalam panduan ini, kami akan menunjukkan bagaimana menggunakan format Atlas HCL dan SQL, karena format JSON biasanya digunakan untuk memproses output dengan jq
.
Untuk memeriksa instansi MySQL yang berjalan secara lokal dan menulis output ke file yang bernama schema.hcl
, gunakan perintah berikut:
atlas schema inspect -u "mysql://root:pass@localhost:3306/example" > schema.hcl
Buka file schema.hcl
untuk melihat definisi struktur tabel Atlas yang menggambarkan database (HCL adalah format konfigurasi struktur tabel yang tidak tergantung pada database yang didefinisikan oleh Atlas). Sebagai contoh, file ini akan berisi konten berikut:
table "users" {
schema = schema.example
column "id" {
null = false
type = int
}
column "name" {
null = true
type = varchar(100)
}
primary_key {
columns = [column.id]
}
}
Kode ini mewakili struktur tabel dengan kolom id
dan name
. Bidang schema
merujuk pada definisi model example
yang ditentukan di bagian lain dalam dokumen ini. Selain itu, sub-blok primary_key
menentukan kolom id
sebagai kunci utama untuk tabel tersebut. Atlas berusaha meniru sintaks dari database yang sedang dioperasikan. Dalam contoh ini, kolom id
memiliki tipe int
, sementara kolom name
memiliki tipe varchar(100)
.
Demikian pula, untuk mengekspor definisi model SQL dari database, Anda dapat menggunakan perintah berikut:
atlas schema inspect -u "mysql://root:pass@localhost:3306/example" --format '{{ sql . }}' > schema.sql
Buka file schema.sql
untuk melihat deskripsi SQL dari database, yang biasanya berisi beberapa pernyataan CREATE TABLE.
Pendekatan ini memudahkan untuk memahami detail struktur tabel database yang sudah ada dan memberikan referensi yang akurat untuk migrasi berbasis versi selanjutnya.
4.1 Declarative Workflow
Declarative Workflow Atlas memungkinkan pengguna secara deklaratif menentukan keadaan akhir yang diinginkan dari database. Pengguna hanya perlu mendeskripsikan keadaan akhir skema database yang mereka inginkan, dan alat Atlas akan secara otomatis membuat dan menjalankan rencana migrasi untuk dengan aman beralih dari keadaan saat ini ke keadaan yang diharapkan ini.
Berikut adalah cara menggunakan Declarative Workflow untuk menentukan dan mencapai keadaan database yang diinginkan:
4.1.1 Mendefinisikan Struktur Tabel Target
Pertama, Anda perlu membuat file yang mendefinisikan struktur database yang diharapkan, yang dapat berupa format HCL, SQL, atau ORM (Object-Relational Mapping).
Mengambil format HCL sebagai contoh, tentukan tabel blog_posts
baru:
table "blog_posts" {
schema = schema.example
column "id" {
null = false
type = int
}
column "title" {
null = true
type = varchar(100)
}
column "body" {
null = true
type = text
}
column "author_id" {
null = true
type = int
}
primary_key {
columns = [column.id]
}
foreign_key "author_fk" {
columns = [column.author_id]
ref_columns = [table.users.column.id]
}
}
Tip: Format sintaks HCL akan dibahas dalam bagian selanjutnya.
4.1.2 Melakukan Migrasi Menggunakan Alat Atlas
Setelah definisi struktur tabel database selesai, Anda dapat menggunakan perintah schema apply
dari Atlas untuk melakukan migrasi.
atlas schema apply \
-u "mysql://root:pass@localhost:3306/example" \
--to file://schema.hcl
Setelah menjalankan perintah di atas, Atlas akan membandingkan skema database yang sudah ada dengan skema yang didefinisikan di file, membuat rencana migrasi, dan meminta pengguna untuk konfirmasi untuk menjalankan. Setelah pengguna mengonfirmasi rencana eksekusi, Atlas akan melakukan migrasi pada database dan memperbarui ke keadaan yang diinginkan.
4.2 Versioned Workflow
Fluktuasi versi adalah mode penggunaan lain yang didukung oleh Atlas, kadang-kadang disebut sebagai "migrasi berbasis perubahan". Ini cocok untuk skenario di mana perubahan skema database perlu dikontrol versi dan ditinjau dalam proses peninjauan kode.
Langkah-langkah dari fluktuasi versi meliputi:
4.2.1 Hitung Perbedaan
Sebelum memulai migrasi, diperlukan untuk membandingkan struktur basis data saat ini dengan kondisi yang diinginkan dan menentukan perbedaan di antara keduanya. Hal ini dapat dilakukan dengan menjalankan perintah atlas migrate diff
.
atlas migrate diff create_blog_posts \
--dir "file://migrations" \
--to "file://schema.hcl" \
--dev-url "docker://mysql/8/example"
Opsi --dir
menentukan URL dari folder migrasi, defaultnya adalah file://migrations
. Opsi --to
menentukan URL dari kondisi yang diinginkan (misalnya, basis data lingkungan pengembangan Anda), dan --dev-url
menyediakan URL untuk basis data pengembangan yang digunakan untuk menghitung perbedaan (perhatikan bahwa --dev-url
ini perlu menentukan basis data kosong yang digunakan Atlas untuk menghitung perbedaan).
Tips: Jika Anda ingin membuat file SQL, lihat bagian sebelumnya untuk mengatur format menggunakan parameter
--format
.
4.2.2 Terapkan Perubahan Migrasi
Setelah perhitungan perbedaan selesai, Atlas akan menghasilkan dua file migrasi yang disimpan di folder migrations
. Misalnya, jika format yang dipilih adalah SQL, file yang dihasilkan oleh perintah diff
, seperti SQL file berikut, berisi perintah migrasi untuk membuat tabel baru:
-- create tabel "blog_posts"
CREATE TABLE `blog_posts` (
`id` int NOT NULL,
`title` varchar(100) DEFAULT NULL,
`body` text DEFAULT NULL,
`author_id` int NULL REFERENCES `users`(id),
PRIMARY KEY (`id`)
);
Setelah file migrasi dihasilkan, Anda dapat menggunakan alat kontrol versi (misalnya, Git) untuk mengelola perubahan ini. Pendekatan ini memungkinkan untuk melakukan modifikasi struktur tabel basis data yang banyak di lingkungan pengembangan, dan saat waktunya untuk rilis, membandingkan lingkungan pengembangan dan lingkungan UAT menggunakan perintah Atlas untuk menghasilkan file migrasi struktur tabel basis data. File-file migrasi ini kemudian dapat diterapkan di lingkungan UAT dan produksi untuk melakukan upgrade basis data.
Kedua alur kerja ini, Deklaratif dan Versi, memberikan fleksibilitas bagi berbagai mode pengembangan dan implementasi, memungkinkan tim untuk memilih metode yang paling sesuai dengan kebutuhan proyek mereka untuk mengelola perubahan skema basis data.
5. Deskripsi Format HCL
5.1 Pengantar
HCL adalah bahasa deklaratif yang digunakan untuk menggambarkan definisi struktur tabel basis data. Atlas menggunakan format HCL untuk menulis skema basis data, menyediakan struktur yang kaya untuk menggambarkan berbagai aspek basis data. Keunggulan HCL terletak pada kemampuannya yang mudah dibaca, mudah dipelihara, dan mendukung fitur-fitur seperti penyisipan variabel dan anotasi tambahan.
Tips: Jika proyek Anda perlu beradaptasi dengan berbagai basis data, menggambarkan struktur tabel dengan cara yang tidak bergantung pada basis data menggunakan HCL bisa sangat nyaman.
5.2 Objek schema
Objek schema
digunakan untuk menggambarkan skema basis data. Di MySQL dan SQLite, itu mewakili DATABASE
, sementara di PostgreSQL, itu mewakili SCHEMA
. Sebuah file HCL dapat berisi satu atau lebih objek schema
.
schema "public" {
comment = "Sebuah komentar skema"
}
schema "private" {}
5.3 Objek table
Objek table
digunakan untuk menggambarkan sebuah tabel di basis data SQL, termasuk kolom, indeks, constraint, dan berbagai properti tambahan yang didukung oleh driver basis data yang berbeda.
table "users" {
schema = schema.public
column "id" {
type = int
}
column "name" {
type = varchar(255)
}
column "manager_id" {
type = int
}
primary_key {
columns = [
column.id
]
}
index "idx_name" {
columns = [
column.name
]
unique = true
}
foreign_key "manager_fk" {
columns = [column.manager_id]
ref_columns = [table.users.column.id]
on_delete = CASCADE
on_update = NO_ACTION
}
}
5.4 Objek column
Objek column
adalah sub-sumber daya dari table
yang digunakan untuk mendefinisikan kolom-kolom dalam tabel.
column "name" {
type = text
null = false
}
column "age" {
type = integer
default = 42
}
column "active" {
type = tinyint(1)
default = true
}
5.5 Objek primary_key
Objek primary_key
adalah sub-sumber daya dari table
yang mendefinisikan kunci utama dari tabel.
primary_key {
columns = [column.id]
}
5.6 Objek foreign_key
Objek foreign_key
adalah sub-sumber daya dari table
yang mendefinisikan kolom-kolom yang merujuk ke kolom di tabel lain.
table "orders" {
schema = schema.market
// ...
column "owner_id" {
type = integer
}
foreign_key "owner_id" {
columns = [column.owner_id]
ref_columns = [table.users.column.id]
on_update = NO_ACTION
on_delete = NO_ACTION
}
}
5.7 Objek index
Objek index
mewakili indeks pada tabel.
index "idx_name" {
columns = [
column.name
]
unique = true
}