Hi Guys,
Apa kabar kalian hari ini? Semoga baik-baik saja. Kali ini gw akan share tutorial mengenai migrasi di nodejs.
Migrasi merupakan sebuah hal yang penting bagi kalian yang ingin memulai sebuah project yang membutuhkan koneksi ke database. Dengan menggunakan migrasi, kalian bisa mengontrol table dan datamelalui cli. Kalau zaman dulu tuh, kalau mau koding gw harus oper-operan flash disc supaya bisa ngopi database atau gw sync database via hosting gitu. Ya itu zaman dulu sih, kalau sekarang ya ga begitu lagi. Untuk lebih jelas, mari kita langsung ke tutorialnya.
Berikut step by stepnya :
- Install dependency yang dibutuhkan.
12345"dependencies": {"mysql": "^2.13.0","sequelize": "^3.30.4","sequelize-cli": "^2.7.0"} - Setelah menginstall dependency, mari kita buat folder config yang berisi mysql.json. File ini kelak digunakan untuk konfigurasi database yang akan berisi table dan data migrasi. Yang perlu diingat adalah harus tetap membuat database karena yang dimigrasi adalah table dan datanya, bukan database secara keseluruhan. Berikut file mysql.json :
1234567891011121314151617181920{"test": {"database": "tutorial_book","host": "127.0.0.1","username": "root","password": ""},"development": {"database": "tutorial_book","host": "127.0.0.1","username": "root","password": ""},"production": {"database": "tutorial_book","host": "127.0.0.1","username": "root","password": ""}} - Bagian berikutnya adalah membuat file config yang akan dijalankan sequelize ketika akan melakukan migrasi. Disini sebenarnya bisa dibuat otomatis oleh sequelize dengan cara init, tapi gw akan membuat secara manual. Berikut contohnya :
123456789101112131415161718192021222324252627const mysqlConfig = require('./config/mysql.json');const environment = process.env.NODE_ENV || 'development';module.exports = {development: {database: mysqlConfig[environment].database,host: mysqlConfig[environment].host,username: mysqlConfig[environment].username,password: mysqlConfig[environment].password,dialect: 'mysql',},test: {database: mysqlConfig[environment].database,host: mysqlConfig[environment].host,username: mysqlConfig[environment].username,password: mysqlConfig[environment].password,dialect: 'mysql',},production: {database: mysqlConfig[environment].database,host: mysqlConfig[environment].host,username: mysqlConfig[environment].username,password: mysqlConfig[environment].password,dialect: 'mysql',},}; - Setelah semua siap, yang paling penting adalah command line yang akan digunakan untuk melakukan migrasi. Disini gw akan membuatnya menjadi versi script npm. Berikut scriptnya :
123456789"scripts": {"init:migration": "node_modules/sequelize-cli/bin/sequelize init:migrations --migrations-path tutorial/migrate/mysql/migrations","init:model": "node_modules/sequelize-cli/bin/sequelize init:models --models-path tutorial/migrate/mysql/models","init:seeder": "node_modules/sequelize-cli/bin/sequelize init:seeders --seeders-path tutorial/migrate/mysql/seeders","model:create": "node_modules/sequelize-cli/bin/sequelize model:create --name $NAME --attributes $ATTR --models-path tutorial/migrate/mysql/models --migrations-path tutorial/migrate/mysql/migrations","migrate": "node_modules/sequelize-cli/bin/sequelize db:migrate --config tutorial/migrate/index.js --migrations-path tutorial/migrate/mysql/migrations","seed:create": "node_modules/sequelize-cli/bin/sequelize seed:create --name $NAME --config tutorial/migrate/index.js --seeders-path tutorial/migrate/mysql/seeders","seed": "node_modules/sequelize-cli/bin/sequelize db:seed:all --config tutorial/migrate/index.js --seeders-path tutorial/migrate/mysql/seeders"}Lalu berikutnya adalah init:models. Ini dipakai untuk membuat folder models sekaligus script index.js yang gw sendiri belum tau gunanya buat apa hehehe.
Setelah models yang terakhir adalah init seeders. Initialize ini untuk tempat penyimpanan data yang kelak akan dimigrasi nantinya.
Setelah semua initialize selesai, maka bentuk foldernya akan seperti berikut :
Abaikan folder yang lain ya. Soalnya itu tutorial yang lain yakni tutorial rabbitmq. Jadi 3 init yang tadi akan menghasilkan folder migrations, models dan seeders. Ketiga folder tersebut ada di dalam folder mysql.
Sekarang lanjut ke bagian membuat model, bagian ini tidak hanya akan membuat model tapi juga migrasi filenya. Kita akan membuat table bernama books dengan field id, book_name, book_author, book_year, createdAt dan updatedAt. field id, createdAt, dan updatedAt dibuat otomatis oleh sequelize create model dan gw males otak-atik karena tutorial ini cuma untuk nunjukkin cara kerja sequelize jadi ga perlu custom-custom banget lah hehe.
Nah untuk resultnya bisa dicek di folder migrations dan models. Untuk file yang difolder migration bentuknya seperti ini.
123456789101112131415161718192021222324252627282930313233'use strict';module.exports = {up: function(queryInterface, Sequelize) {return queryInterface.createTable('books', {id: {allowNull: false,autoIncrement: true,primaryKey: true,type: Sequelize.INTEGER},book_name: {type: Sequelize.STRING},book_author: {type: Sequelize.STRING},book_year: {type: Sequelize.CHAR(4)},createdAt: {allowNull: false,type: Sequelize.DATE},updatedAt: {allowNull: false,type: Sequelize.DATE}});},down: function(queryInterface, Sequelize) {return queryInterface.dropTable('books');}};Sedangkan untuk file yang di folder models bentuknya seperti ini.
123456789101112131415'use strict';module.exports = function(sequelize, DataTypes) {var books = sequelize.define('books', {book_name: DataTypes.STRING,book_author: DataTypes.STRING,book_year: DataTypes.CHAR(4)}, {classMethods: {associate: function(models) {// associations can be defined here}}});return books;};Karena skema table sudah selesai dibuat tinggal di generate, maka yang berikutnya adalah menyiapkan seeder dan isi data dari table tersebut. Nah untuk membuat seedernya, yang perlu digunakan adalah seed:create.
Berikut file generate dari seed:create.
12345678910111213const fs = require('fs');const path = require('path');module.exports = {up: (queryInterface) => {const data = fs.readFileSync(path.join(__dirname, 'data', 'books.json'), 'utf8');const searchForm = JSON.parse(data);return queryInterface.bulkInsert('books', searchForm);},down: queryInterface => queryInterface.bulkDelete('books', null, {}),};Cuma disini ada yang perlu dicustom yakni function up dan down. Isi function up adalah menginsert semua data yang ada di dalam books.json sedangkan function down adalah untuk menghapus semua isinya. Jadi nanti pada saat setelah generate pasti dapatnya isi function kosongan. Kudu dicustom sendiri ya nanti. Untuk file books.jsonnya seperti berikut.
12345678910111213141516171819202122232425262728293031[{"book_name": "Clean Code","book_author": "James Jordan","book_year": "2015","createdAt": "2017-01-14 08:24:44","updatedAt": "2017-02-14 08:24:44"}, {"book_name": "Domain Driven Design","book_author": "Alpha Omega","book_year": "2016","createdAt": "2017-03-14 08:24:44","updatedAt": "2017-04-14 08:24:44"}, {"book_name": "Mastering PHP","book_author": "Dexter Frederick","book_year": "2016","createdAt": "2017-05-14 08:24:44","updatedAt": "2017-06-14 08:24:44"}, {"book_name": "NodeJS for Dummies","book_author": "William Luther","book_year": "2013","createdAt": "2017-07-14 08:24:44","updatedAt": "2017-08-14 08:24:44"}, {"book_name": "Pattern and Principle DDD","book_author": "El Fransisco","book_year": "2014","createdAt": "2017-09-14 08:24:44","updatedAt": "2017-12-14 08:24:44"}]Oke karena semua persiapan sudah beres mari kita lakukan migrasi table books ke database tutorial_book. Untuk commandnya adalah.
1npm run migrateSetelah berhasil, bisa dicek databasenya. Seharusnya sudah ada table books.
Yang perlu diperhatikan adalah saat melakukan migrasi, sequelize akan membuatkan sebuah table bernama sequelizemeta. Biarkan saja karena kita tidak akan mengotak-ngatik table tersebut. Yang perlu diperhatikan adalah skema table books. Apakah sudah sesuai dengan yang sudah kita deklarasikan sebelumnya?
Jika sudah selesai, maka lanjut lagi untuk mengisi datanya. Jika belum, coba dicek lagi, apakah ada yang kelewatan mungkin langkahnya. Kalau masih bingung bisa coba googling ya. Jangan males deh.
Nah bagian yang terakhir adalah mengisi table dengan data yang telah kita deklarasikan sebelumnya di books.json. Untuk commandnya adalah.
1npm run seedJika sudah berhasil, maka seharusnya table books sudah ada isinya dan sesuai dengan yang dibuat di books.json. Berikut hasilnya.
Nah untuk yang mau coba-coba kodingnya, silahkan fork githubnya disini.
Oke, demikian sedikit tutorialnya. Semoga bermanfaat bagi para pembaca disini hehe.