Iman Sugirman
Iman Sugirman
Fullstack Developer, Software Engineer, Frontend Developer

Setup Sequelize ORM Agar Lebih mudah Relasi dan Query

25 Oktober 2022

Sequelize adalah ORM untuk nodejs untuk mempermudah anda dalam Query dan Relasi ke Database RDBMS, dan sangat mudah digunakan serta mendukung untuk Postgresql, Tadinya saya tidak menyukai Sequelize karena pengaturannya yang cukup rumit dan sangat banyak mengalami ketidak compatibelan di beberapa platform, seperti webpack karena kasusnya ketika saya menggunakan nextjs

Buat file .sequelizerc

Buatlah file di root project folder anda dengan nama .sequelizerc seperti berikut.

const path = require('path'); module.exports = { config: path.resolve('config', 'dbconfig.js'), 'migrations-path': path.resolve('db', 'migrations'), 'models-path': path.resolve('db', 'models'), 'seeders-path': path.resolve('db', 'seeders'), };

Pengertian diatas adalah untuk penempatan file-file yang akan kita atur dengan Sequelize dimana file dbconfig.js sebagai konfigurasi untuk koneksi ke database dan ditempatkan di folder ./config/dbconfig.js, sementara folder migrations ada di sub folder db begitupun yang lainnya.

Install sequelize-cli terlebih dahulu agar anda lebih mudah membuat migration dan termanage dengan baik.

npm install --save-dev sequelize-cli # atau agar bisa dipakai setiap waktu npm install -g sequelize-cli # Install globally

Oke berikutnya masukan perintah :

sequelize init

untuk membuat folder-folder diatas

Ubah Konfigurasi Database

Ubah Beberapa Konfigurasi seperti berikut :

require('dotenv').config(); const { parse } = require('pg-connection-string'); const connectionString = process.env.DATABASE_URL; const connector = parse(connectionString); const configdb = { ... url: process.env.DATABASE_URL, username: connector.user, password: connector.password, database: connector.database, host: connector.host, dialect: 'postgres' ... }; module.exports = configdb;

Pengaturan diatas saya asumsikan anda menggunakan Postgresql untuk Databasenya.

Membuat Migration

Sekarang kita buat migration dan model saya contohkan membuat 2 model Province dan City dan masukan perintahnya seperti berikut :

## Membuat model Province sequelize model:create --name Province --attributes name:string

perintah diatas maka akan membuat 2 file yaitu model province.js dan migration file ...-create-province.js dan jika ada yang mau diubah silahkan diubah untuk file migrationnya.

## Membuat model City sequelize model:create --name City --attributes name:string,province_id:integer,postal_code:string,type:enum

perintah diatas maka akan membuat 2 file yaitu model city.js dan migration file ...-create-city.js dan jika ada yang mau diubah silahkan diubah untuk file migrationnya.

Ubah Model Index

Nah selain pengaturan diatas anda juga harus mengatur file di folder ../models/index.js menjadi seperti ini

'use strict'; const Sequelize = require('sequelize'); const configdb = require('@/config/dbconfig'); const db = {}; const sequelize = new Sequelize(configdb.url, { dialect: configdb.dialect, host: configdb.host, pool: configdb.pool, logging: configdb.logging, }); db.sequelize = sequelize; db.Sequelize = Sequelize; module.exports = db;

Sekarang sudah tampak sangat sederhana dan simple maka anda akan lebih mudah untuk memanage relasi. Saya akan berikan contoh salah satu model yang saya buat.

// Model Province 'use strict'; module.exports = (sequelize, DataTypes) => { const Province = sequelize.define( 'provinces', { name: { type: DataTypes.STRING, allowNull: false, validate: { notNull: { msg: 'Please Enter Name', }, }, }, }, { sequelize, modelName: 'Province', tableName: 'provinces', createdAt: 'created_at', updatedAt: 'updated_at', } ); return Province; };

Kode diatas adalah model Province dan kemudian kita akan buat model City seperti dibawah ini.

'use strict'; module.exports = (sequelize, DataTypes) => { const City = sequelize.define( 'cities', { name: { type: DataTypes.STRING, allowNull: false, }, province_id: { type: DataTypes.INTEGER, references: { model: { tableName: 'provinces', }, key: 'id', }, allowNull: false, }, postal_code: { type: DataTypes.STRING, }, type: { type: DataTypes.ENUM, values: ['kota', 'kabupaten'], defaultValue: 'kota', allowNull: false, }, }, { sequelize, modelName: 'City', tableName: 'cities', createdAt: 'created_at', updatedAt: 'updated_at', } ); return City; };

Maka akan jelas disini untuk model agar bisa kita relasikan di file index.js seperti berikut.

'use strict'; const Sequelize = require('sequelize'); const configdb = require('@/config/dbconfig'); const db = {}; const sequelize = new Sequelize(configdb.url, { dialect: configdb.dialect, host: configdb.host, pool: configdb.pool, logging: configdb.logging, }); db.sequelize = sequelize; db.Sequelize = Sequelize; // Tambahkan Baris ini db.Province = require('./Province')(sequelize, Sequelize); db.City = require('./City')(sequelize, Sequelize); // dan kita relasikan sebagai berikut; // provinsi mempunyai beberapa kota db.Province.hasMany(db.City, { foreignKey: 'province_id', as: 'cities', sourceKey: 'id', }); // dan tiap kota memiliki provinsi id masing-masing db.City.belongsTo(db.Province, { foreignKey: 'province_id', as: 'province', targetKey: 'id', }); module.exports = db;

dan ketika di panggil Query di Controller maka akan seperti ini :

... import { City, Province } from '../db/models'; ... const models = await Province.findAll({ attributes: ['id', 'name', 'created_at'], include: [ { model: City, as: 'cities', attributes: ['name', 'id'], }, ], });

Nah berikut tips dari saya untuk Setup Sequelize ORM Agar Lebih mudah Relasi dan Query dan semoga anda bisa membuat banyak relasi disini dan lebih mudah memanage relasi database antar table.