Waterline adalah salah library untuk melakukan ORM(Object relational mapping) pada nodejs. Waterline sendiri digunakan pada framework sails js. Terdapat banyak adapter yang mesupport database terkenal seperti mongodb, postgresql, mysql dan lain sebagaiannya.
Fungsi
Waterline sebagai tools untuk ORM menawarkan pembuatan API dengan menggunakan berbagai macam database yang ada dengan satu query yang sama. Untuk mendapatkan data user dari collections mongodb ataupun mysql/postgresql cukup dengan find(). Kita tidak perlu menspesifikasikan query untuk masing-masing jenis database. Model seperti ini akan meningkatkan fleksibilitas dari aplikasi (mudah diport ke database manapun) dan mengurangi learning curve mempelajari database lain.
Alternative
Pada kontex ORM(object relational mapping). Waterline bukanlah tools satu-satunya melainkan terdapat mongoose (ORM spesifik untuk mongodb), Active records dan Hibernate. Balderdashy sebagai pengembang (developer) dari waterline memiliki keunggulan yang tidak ada pada ketiga tools ORM lainnya yaitu :
- Fresh prespective (pendekatan yang berbeda terkait model)
- Tingkat testability yang lebih besar
- Konsistensi adapter. Terdapat official adapter dan community adapter yang sampai saat ini terus berkembang.
Hingga saat ini setidaknya terdapat 18 adapter yang siap digunakan dengan waterline.
Sails vs waterline
Waterline adalah salah satu modul yang terdapat pada sails. jika kita menggunakan sails tentunnya juga akan menggunakan waterline namun kita juga dapat menggunakan waterline secara terpisah dengan sails.
What will we build ?
kita akan mensetup waterline dengan menggunakan mongodb adapter.
Setup
1.Init project
Langkah pertama tentunnya kita akan membuat project nodejs pada suatu folder tertentu dengan menggunakna perintah
npm init
setelah itu install beberapa package berikut
- waterline , komponen utama yakni core module dari waterline itu sendiri.
- mongodb adapter.
perintah yang digunakan adalah
npm install waterline sails-mongo --save
jika anda ingin menggunakan adapter lainnya maka berikut adalah daftar link github untuk beberapa adapter official.
nama adpter | link |
postgresql | https://github.com/balderdashy/sails-postgresql |
mysql | https://github.com/balderdashy/sails-mysql |
mongodb | https://github.com/balderdashy/sails-mongo |
microsoft sql server | https://github.com/cnect/sails-sqlserver |
setelah itu buat index.js (tergantung dari spesifikasi npm init anda) dan panggil kedua package diatas dengan require. Kemudian buatlah instances waterline. Biasannya intances waterline ini diberi nama ORM agar tidak membingungkan (tetapi terserah pada preferensi anda).
var mongoDbAdapter = require('sails-mongo'); var waterline = require('waterline'); var orm = new waterline();
2. Membuat config waterline
setelah itu buat variabel config yang isinnya adalah object “adapter” dan “connections“. Object adapter memiliki parameter wajib yakni “adapters” yang menspesifikasikan jenis adapter yang digunakan oleh waterline. Kemudian connections memiiki parameter wajib berupa “default” isinnya adalah konfigurasi koneksi ke adapter tersebut.
Berikut ini adalah contoh config yang kami gunakan untuk adapter mongodb. Jika anda menggunakan adapter lain isi dari config sama hanya saja berbeda isinya.
Config adapter & connection adapter mongodb
var config = { adapters : { 'mongoadapter' : mongoDbAdapter }, connections : { default :{ adapter: 'mongoadapter', host: 'localhost', port: 27017, database: 'dudu-api' } } }
Config connection adapter mysql
default : { adapter: 'sails-mysql', host: 'YOUR_MYSQL_SERVER_HOSTNAME_OR_IP_ADDRESS', user: 'YOUR_MYSQL_USER', //optional password: 'YOUR_MYSQL_PASSWORD', //optional database: 'YOUR_MYSQL_DB' //optional }
Config connection adapter postgresql
default: { adapter: 'sails-postgresql', host: 'YOUR_POSTGRES_SERVER_HOSTNAME_OR_IP_ADDRESS', user: 'YOUR_POSTGRES_USER', // optional password: 'YOUR_POSTGRES_PASSWORD', // optional database: 'YOUR_POSTGRES_DB' //optional }
3. Membuat model
Selanjutnya kita akan membuat model yang dibuat menggunakan fungsi waterline.connection.extend(). Disini kita akan menspesifikasikan berbagai konfigurasi untuk model. Yang paling utama adalah attribute dari model tersebut. Field/kolom apa saja yang ada pada collections/tabel tersebut. Ini adalah contoh model “user” yang kami buat
// create spesifik model var userCollection = waterline.Collection.extend({ identity : 'user', connection : 'default', tableName : 'user', schema : true, adapter : 'mongoadapter', attributes : { nama : { type : 'string' } } }) orm.loadCollection(userCollection);
sedikit penjelasan mengenai parameter-parameter diatas.
- Identity. identitas dari model atau nama dari model. Nama ini yang akan kita panggil saat melakukan query atau bisa disebut dengan nama dari collections(bukan collections mongodb).
- table , nama dari tabel(jika menggunakan sql) atau collections(jika menggunakan mongodb) yang nantinnya akan dibuat.
- connections, konfigurasi koneksi. Isi dari koneksi ini kita ambil dari config yang sudah kita buat pada langkah sebelum ini yakni ‘default’.
- schema, jika false maka tidak ada restriksi mengenai data yang masuk ke database (mengabaikan attributes). jika true maka data yang bisa dimasukan (saat request api post/put) hanya yang terdefinisi pada attribute
- Attribute, daftar field yang ada pada tabel/collections.
- adapter, nama dari adapter (sesuaikan dengan config yang sudah dibuat).
Enam parameter diatas perlu kita tentukan saat membuat model. Inilah keutungan dengan ORM cukup membuat satu model namun dapat digunakan untuk berbagai macam database.
4. Menginisiasi waterline
Proses selanjutnya adalah menginisiasi waterline / menjalankan ORM. Berikut adalah kode untuk menjalankan waterline.
orm.initialize(config, function(err,ontology){ if(err){ console.log(err) } var User = ontology.collections.user; User.create({ nama : 'degananda' }).exec(function (err,user){ console.log(user); }) })
untuk mengakses model kita menggunakan ontology(callback) anda dapat menamainnya dengan nama apapun dengan query tertentu. Misalkan untuk membuat data querynya adalah model.create() sedangkan untuk read/mendapatkan data querynya adalah find(). Pembahasan mengenai waterline query ini akan dibahas pada ulasan selanjutnya.
5. Done
jalankan dengna menggunakan
node index.js
atau jika anda menggunakan nodemon
nodemon index.js localhost 7787
maka pada console akan nampak seperti berikut ini
full code
ini adalah fullcode dari kode-kode diatas
var mongoDbAdapter = require('sails-mongo'); var waterline = require('waterline'); var orm = new waterline(); // setup config var config = { adapters : { 'mongoadapter' : mongoDbAdapter }, connections : { default :{ adapter: 'mongoadapter', host: 'localhost', port: 27017, database: 'dudu-api' } } } // create spesifik model var userCollection = waterline.Collection.extend({ identity : 'user', connection : 'default', tableName : 'user', schema : true, adapter : 'mongoadapter', attributes : { nama : { type : 'string' } } }) orm.loadCollection(userCollection); // setup waterline orm.initialize(config, function(err,ontology){ if(err){ console.log(err) } var User = ontology.collections.user; User.create({ nama : 'degananda' }).exec(function (err,user){ console.log(user); }) })