Eksplorasi Database di AdonisJS

Ahmad Arif
AdonisID
Published in
8 min readFeb 10, 2018
Database Adonis, Source from owner ceritadikit.com

Adonis mendukung penggunaan berbagai jenis database, dan juga berbagai fungsi yang yang dapat mempercepat pengembangan pembuatan perangkat lunak. Fitur-fitur keren yang dimiliki Adonis untuk membuat aplikasi berbasis data adalah Query Builder, Lucid ORM, Database Migrations, dan Database Seeder.

Berikut ini adalah daftar database yang didukung Adonis, dan cara memasang drivernya:

Cukup lengkap kan dukungan database yang disupport Adonis? 😍

Adonis menggunakan Knex.js dalam mengimplementasikan provider databasenya. Sehingga jika kamu kebingungan untuk menjalankan suatu fungsi atau apapun, dan tidak dapat ditemukan di dokumentasi database Adonis kamu dapat mengecek di dokumentasi yang dimiliki Knex.js.

Instalasi Adonis Database

Secara default Adonis dapat menggunakan database, namun jika saat membuat proyek baru menggunakan boilerplate slim (adonis new apps --slim) maka kamu perlu memasang Database Provider untuk dapat menggunakannya. Berikut langkah untuk memasang providernya:

  • Install menggunakan npm
adonis install @adonisjs/lucid
  • Jika instalasi sudah selesai, langkah selanjutnya adalah mendaftarkan provider ke dalam file start/app.js:
const providers = [
'@adonisjs/lucid/providers/LucidProvider'
]

const aceProviders = [
'@adonisjs/lucid/providers/MigrationsProvider'
]

Konfigurasi

Konfigurasi database provider Adonis dapat dicek di config/database.js, dimana secara default Adonis menggunakan database sqlite. Kamu dapat menyesuaikan beberapa konfigurasi di dalam file tersebut, misalnya host, username, password, nama database, maupun port yang digunakan.

Konfigurasi lain yang dapat dilakukan untuk mengatur penggunaan database di Adonis adalah lewat file .env yang berada di folder root proyek kamu. Seperti mengatur koneksi database yang digunakan, dan pengaturan lainnya. Konfigurasi di file .env juga mengatur penggunaan database yang digunakan di aplikasi, berikut contohnya:

DB_CONNECTION=sqlite
DB_HOST=127.0.0.1
DB_PORT=3306
DB_USER=root
DB_PASSWORD=
DB_DATABASE=adonis

Database Migration

Fitur migrations pada Adonis berfungsi untuk menjalankan DDL (Data Definition Language). Dengan fitur ini kita dapat membuat maupun mengubah struktur tabel pada database, tanpa harus repot menjalankan kode SQL lewat terminal maupun database editor tertentu.

Database migration memiliki fungsi yang sama dengan versioning tools seperti git dan svn, yaitu untuk mendokumentasikan setiap perubahan yang terjadi pada skema database. Sehingga memudahkan untuk bekerja sebagai tim, dimana perubahan skema database dari satu pengembang mudah digunakan oleh pengembang lain di dalam tim.

Letak file migrations berada di folder database/migrations, di folder tersebut akan diletakkan file migrations beserta keterangan waktu saat file tersebut dibuat. Secara default Adonis memiliki 2 file migrations yaitu user dan token. Berikut isi file user migrations:

File skema ditulis dengan Javascript ES6, dengan fungsi up dan down.

  • Fungsi up

Fungsi up digunakan untuk melakukan aksi terhadap tabel. Dapat digunakan untuk membuat tabel baru atau mengubah tabel yang ada.

  • Fungsi down

Fungsi down adalah kebalikan dari fungsi up. Misalnya pada fungsi up kamu membuat tabel baru, maka pada fungsi down kamu cukup memasukan kode untuk menghapus/drop tabel tersebut.

Membuat migrations

Untuk membuat migration, cukup dengan menggunakan perintah adonis make:migration. Misalnya kita akan membuat tabel news, maka perintahnya adalah sebagai berikut:

adonis make:migration news

Setelah itu akan ada pilihan apakah mau membuat tabel baru atau mengubah kolom pada tabel, seperti screenshot di bawah ini:

Tinggal menggerakan dengan tombol panah atas dan bawah untuk memindahkan pilihan, dan jika sudah menentukan tinggal menekan enter. Berikut tampilan setelah memilih untuk membuat tabel baru:

Mari kita coba tambahkan field title bertipe string dan field content bertipe text. Informasi detail untuk pembuatan skema di Adonis dapat dilihat di sini. Berikut ini skema tabel news yang kita definisikan:

Menjalankan migrations

Untuk menjalankan migration, cukup dengan perintah berikut:

adonis migration:run

Jika kamu belum install driver databasenya (dalam tutorial ini saya menggunakan sqlite), maka akan muncul error seperti berikut:

Untuk memperbaiki kesalahan ini, cukup install driver sqlite seperti yang diperintahkan pada hint error. Ketikkan perintah npm install sqlite3 --save. Setelah selesai jalankan kembali perintah adonis migration:run, berikut outputnya:

Jika kamu cek menggunakan sqlite browser maka akan terlihat 4 tabel, yaitu:

  1. Tabel users: tabel default saat inisialisasi proyek
  2. Tabel tokens: tabel default saat inisialisasi proyek
  3. Tabel news: tabel yang kita buat barusan
  4. Tabel adonis_schema: tabel yang mencatat/mendokumentasikan perubahan pada skema database untuk keperluan versioning.

Pada tabel adonis_schema terdapat beberapa kolom, yaitu sebagai berikut:

  1. id: ID yang unik untuk data pada tabel adonis_schema
  2. name: informasi nama file yang dieksekusi/dijalankan
  3. batch: informasi yang menjelaskan kapan file migrations dieksekusi, fungsi lainnya adalah untuk mengulang/kembali ke versi skema database tertentu dengan menentukan batch terakhir yang mau dikembalikan. Setiap menjalankan perintah adonis migration:run, batch baru akan terbentuk untuk semua skema yang terdapat di folder migration dan belum dieksekusi/tersimpan di tabel adonis_schema
  4. migration_time: waktu (tanggal dan jam) saat mengeksekusi file migration

Untuk mengecek tabel apa saja yang sudah dimigrasi oleh Adonis, cukup dengan menggunakan perintah berikut:

adonis migration:status

Berikut ini hasilnya:

Berikut ini beberapa perintah migration yang dapat digunakan:

Database Seeder dan Database Factory

Database seeder merupakan fitur yang digunakan untuk mengerjakan DML (Data Manipulation Language). Seeder berfungsi untuk melakukan inisialisasi data pada tabel, seperti adanya kebutuhan yang pasti jika pada aplikasi tertentu harus memiliki data user default, bisa untuk kebutuhan membuat data dummy atau memang untuk keperluan utama dari aplikasi. Seeder berisikan fungsi run yang bertugas menjalankan perintah untuk proses DML, misal menambahkan sebuah data baru dengan cara meng-instance kan dari model yang sudah dibuat, menggunakan query builder, atau dengan membuat data acak/random menggunakan Database Factory. Lokasi file seeder berada di folder database/seeds.

Sedangkan Database Factory digunakan untuk membuat cetakan(blueprint) struktur data dan kemudian mengguanakannya untuk menghasilkan data dummy. Struktur factory harus disesuaikan dengan struktur yang dimiliki tabel yang akan dibuatkan cetakannya. Database Factory yang digunakan Adonis adalah chancejs, untuk mengetahui ada fungsi apa saja yang dapat digunakan untuk membuat data dummy menggunakan factory bisa cek di link ini. Lokasi file factory berada di file database/factory.js.

Menggunakan Seeder dan Factory

  • Membuat factory untuk blueprint struktur data tabel users
  • Membuat file seeder untuk tabel user
adonis make:seed User

Perintah tersebut akan membuat file yang nanti dieksekusi saat menjalankan proses seed. Dalam file seeder, kita dapat menggunakan factory yang telah dibuat maupun dengan memanfaatkan model yang telah dibuat. Berikut contohnya:

  • Untuk menjalankan seeder yang telah dibuat, gunakan perintah berikut
adonis seed

Setelah menjalankan perintah di atas, silahkan cek tabel users di database.

REPL (Read-Eval-Print-Loop)

Sebelum berlanjut ke pembahasan Query Builder dan Lucid ORM. Ada fitur yang perlu dibahas terlebih dahulu, guna menunjang pembelajaran materi selanjutnya. REPL sendiri merupakan fitur yang disediakan oleh Adonis untuk berinteraksi dengan kode melalui perintah yang diketik di terminal. Sehingga kamu dapat mencoba-coba terlebih dahulu kode yang akan dibuat sebelum dituliskan ke aplikasi, dan kamu akan mendapatkan hasilnya secara instan di terminal.

Untuk menggunakan fitur REPL ini, kamu tinggal mengetikkan perintah:

adonis repl

Setelah mengetikkan perintah di atas, terminal kamu sekarang berada pada mode repl, sehingga dapat mengetikkan perintah untuk menjalankan class yang dibuat, maupun mencoba library atau helper yang disediakan Adonis.

Sekarang kita akan mencoba menggunakan REPL mode untuk memasukkan data ke dalam database, menggunakan fitur Query Builder yang tersedia di Adonis. Silahkan ikuti kode berikut:

  • Import fungsi Database
Database = use('Database')
  • Import helper Hash
Hash = use('Hash')
  • Tambah data user ke tabel users
await Database.table('users').insert({ username: 'username-from-repl', email: 'email-from-repl@mail.com', password: await Hash.make('123') })

Perintah di atas dieksekusi akan menampilkan id user yang baru saja ditambahkan.

  • Menampilkan semua data user
await Database.select('*').from('users')

Kerenkan? Makin bahagia deh developernya 🎉🎊😁

Query Builder

Adonis menyediakan fitur Query Builder yang berguna untuk berinteraksi dengan SQL menggunakan Javascript. Menulis query SQL kadang membosankan dan melelahkan, apalagi ketika membuat program yang mendukung lebih dari 1 jenis database. Dengan Query Builder kamu tidak perlu repot mengubah query SQL dari database satu ke format yang didukung database lainnya. Penulisan ulang query SQL biasa perlu dilakukan untuk memastikan query bekerja dengan baik di database engine satunya lagi. Hal tersebut dapat kamu hindari dengan memanfaatkan Query Builder yang disediakan Adonis.

Query Builder mendukung beberapa operasi SQL, termasuk memberikan kemudahan ketika kamu membutuhkan raw query untuk aplikasi yang dikembangkan. Berikut ini beberapa contoh yang dapat digunakan menggunakan Query Builder:

Makin bahagia lagi aja nih 😍

Lebih lengkapnya silahkan kunjungi dokumentasinya di link ini.

Lucid ORM

ORM atau Object Relational Mapping adalah suatu teknik pemrograman yang digunakan untuk mengkonversi data dari lingkungan bahasa berbasis object-oriented dengan lingkungan database relational.

wikipedia.com

ORM memiliki kemampuan untuk menciptakan objek database virtual, yaitu suatu model yang direpresentasikan ke dalam sebuah objek pada bahasa pemrograman OOP. Library untuk menggunakan ORM di Adonis adalah Lucid ORM. Berikut ini adalah fitur yang dimiliki Lucid ORM:

  1. Dapat mengambil dan menyimpan objek model secara transparan
  2. API yang ekspresif untuk mengelola relationship (relasi antar tabel)
  3. Dapat menentukan life-cycle hook untuk menjaga kode tetap DRY
  4. Memiliki Getter dan Setter untuk mengelola data on the fly
  5. dan masih banyak lainnya.

Membuat Model

Setelah sebelumnya sudah membuat migrations untuk tabel news, mari sekarang kita buat modelnya dengan perintah berikut:

adonis make:model News

Jika belum membuat file migrations, bisa menambahkan parameter --migration di belakangnya. Sehingga akan membuat migrations beserta modelnya. Berikut kelas News.js hasil generatenya:

Secara otomatis nama model mewakilkan nama tabel di database. Namun Lucid ORM juga mencocokkan nama tabel berdasarkan konsep Plural dan Singluar Nouns. Sehingga untuk nama model User, mewakili tabel dengan nama users. Untuk mengurangi kebingungan kamu dapat menambahkan function table() untuk mengatur mapping antar nama model dan nama tabel di databasenya, berikut kodenya:

static get table () {
return 'tabel_name'
}

Contoh Penggunaan Lucid ORM

  • Mengambil semua data di tabel users
const User = use('App/Models/User')
const users = await User.all()
  • Mengambil user berdasarkan yang memiliki ID=1
const User = use('App/Models/User')
const user = await User.find(1)
  • Menyimpan user baru ke database
const User = use('App/Models/User')
const user = new User()
user.username = 'newuser'
user.email = 'new-user@mail.com'
user.password = 'some-password'
await user.save()

Contoh lainnya bisa langsung cek ke dokumentasi di link ini.

Database Hooks

Hooks adalah sebuah tindakan yang dilakukan sebelum atau sesudah operasi database tertentu. Contoh penggunaan hooks di Lucid ORM adalah melakukan hashing terhadap password sebelum disimpan ke database.

Objek UserHook di file app/Models/Hooks/User.js memiliki fungsi bernama hashPassword yang akan melakukan hash terhadap password yang dimasukkan ke objek userInstance.

Untuk menggunakan fungsi hashPassword di model User, yaitu dengan mendefinisikannya di dalam function boot() di dalam model User. Berikut contohnya:

static boot () {
super.boot()
this.addHook('beforeCreate', 'User.hashPassword')
}

Dengan menambahkan kode di atas ke dalam file app/Models/User maka, setiap kita menggunakan model User dan menambahkan data baru melalui model User maka password yang dimasukkan secara plain, akan dihash sebelum proses simpan ke database. Contohnya sebagai berikut:

const User = use('App/Models/User')
const user = new User()
user.username = 'newuser'
user.email = 'new-user@mail.com'
user.password = 'some-password'
await user.save()

Nilai password di isi string “some-password “, namun ketika disimpan ke dalam database password tersebut dihash terlebih dahulu. Sehingga field password di tabel users memiliki nilai lain dari hasil hash sebelum disimpan.

Pelajari berbagai fungsi hooks lain di dokumentasi pada link ini.

Cukup mudah kan? 😃
Hasil belajar kali ini bisa dicek di repo berikut

Jangan lupa untuk join Adonis Indonesia di channel berikut:

--

--