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
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 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.
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.
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.