Blog

Sequelize Nedir?

Eskiden uygulamalarımızı, veritabanlarına doğrudan bağlayıp, veritabanı işlemlerini SQL sorgularıyla yaparken ilerleyen yazılım teknolojisi, nesne tabanlı programlama dillerinin yaygınlaşmasıyla ve veritabanı yönetim sistemlerinin çoğalmasıyla birlikte SQL sorgularının karmaşıklığının ortadan kaldırılması ve daha okunaklı kodlar yazabilmek için ‘ORM’ (Object Relational Mapping) yapıları ortaya çıktı. ORM ile kod içerisine SQL satırları yazma ortadan kaldırılmış oldu. Sequelize bir ORM sistemi olup daha okunaklı kodlar yazmamızı, veri tabanı yönetim sistemimiz değiştiği zaman birkaç satırı değiştirerek uygulamamızı yeni bir veri tabanına bağlamamızı sağlayan, veri tabanı ile node.js arasındaki ORM sistemini sağlayan bir javascript paketidir.

sequelize

Bir Uygulama ile Örnekleyelim

Şimdi node js üzerine sequelize nasıl kurulur bir örnekle açıklayalım. Öncelikle yeni bir dosya oluşturup, dosya içerisinde;

npm init

komutunu çalıştırın. Bu komuttan sonra gerekli npm paketlerini kurmak için;

npm install express sequelize sequelize-cli body-parser pg pg-hstore cors dotenv nodemon

Komutunu çalıştırın. Bu komuttaki sequelize ve sequelize-cli paketleri uygulamamıza sequelize dahil edecektir. Pg ve pg-hstore paketleri ise uygulamaya postgresql kullanmak için gerekli olacak paketler. Nodemon uygulamanın hataya düştüğü zaman kendini durdurmamasını sağlar. Bu komuttan sonra;

sequelize init

komutunu çalıştırın. Bu komut ile uygulamamıza artık sequelize bağlanmış durumda olacaktır. Sequelize ayarlarını yapmak için bir config dosyası oluşturun.  Bu dosyada sequelize için gerekli olan kullanılan veri tabanı bilgilerini ve gerekli ayarlar yapılacaktır. Postgresql için bir örnek verecek olursak;

require('dotenv').config();
module.exports = {
  development: {
    username: "burak",
    password: "123456",
    database: "books",
    host: "127.0.0.1",
    dialect: "postgres"
  },
  test: {
    username: "burak",
    password: "123456",
    database: "books",
    host: "127.0.0.1",
    dialect: "postgres"
  },
  production: {
    username: "burak",
    password: "123456",
    database: "books",
    host: "127.0.0.1",
    dialect: "postgres"
  }
}

Yukarıda bulunan kod örneğinde development, test ve production ortamları için ayrı ayrı sequelize ayarlarımızı tanımladık.

username”: veritabanı kullanıcı adı,

password: veritabanı yöneticisi şifresi,

database”: veritabanı adı,

host”: veritabanın bulunduğu adres,

dialect”: kullandığımız veritabanı postgresql olduğu için postgres, diğer veritabanları için bu kısmı değiştirerek apiyi istediğimiz veritabanına bağlamış olacağımız kısım, diğer veritabanları için kullanılacak olan dialectleri aşağıda bulunmaktadır.

MySql veritabanı için ‘mysql’,

MariaDb veritabanı için ‘mariadb’,

Sqlite veritabanı için ‘sqlite’,

PostgreSql veritabanı için ‘postgres’,

MsSql veritabanı için ‘mssql’,

Dialectleri kullanılır.

Sequelize ayarlarını tamamladıktan sonra bir kök dizinimizde ‘.sequelizerc’ isimli bir dosya oluşturalım. Bu dosya sequelize için gerekli olan modellerin, seederların, bir önceki adımda oluşturduğumuz config dosyamızın ve migrationlarımızın yollarını tutan bir modül olacak. Buna bir örnek aşağıda verilmiştir.

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

Bu adımdan sonra babel konfigürasyonlarımızı yapıp modellerimizi oluşturup migrate işlemimizi yapacağız. Tarayıcılar es6 dilini tanımazlar.  Babel es6 ile yazılmış kodu tarayıcıya es5’e çevirerek iletmemizi sağlayan bir pakettir. İlk olarak babel paketlerimizi kuralım.

npm install  --save-dev babel-cli babel-core @babel/core babel-preset-env

Paketlerimizi kurduktan sonra yine kök dizinde ‘.babelrc’ dosyası oluşturalım ve içerisinde gerekli sequelize için gerekli konfigürasyonlarımızı yazalım. Dosya örneği aşağıda verilmiştir.

{
  "presets": [
    ["env", {
      "targets": {
        "node": "current"
      }
    }]
  ]
}

Babel ayarlarını yaptıktan sonra node uygulamamızın babel ile çalışmasını sağlamak için package.json dosyasında script alanını aşağıdaki gibi düzenlememiz gerekir.

"start": "nodemon --exec babel-node index.js"

Bu işlemden sonra sequelize ile tablolarımızı oluşturabiliriz. Örnek olarak asağıdaki komutu inceleyebilirsiniz.

sequelize model:create –name User –attributes name:string, username:string, email: string, password:string

Bu kod az önce oluşturduğumuz ‘.sequelizerc’ dosyasında  belirlenen modeller için ayardaki yola giderek orada ‘user.js’ isimli bir dosya ve migration için belirlenen yolda da kendisi için bir migration oluşturur.

user.js dosyası aşağıdaki gibi olmalıdır;

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class User extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  };
  User.init({
    name: DataTypes.STRING,
    username: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING
  }, {
    sequelize,
    modelName: 'User',
  });
  return User;
};

Tablomuzu oluşturduktan sonra bu tabloyu veri tabanında oluşturmak için aşağıdaki komutu çalıştırmak gerekir.

sequelize db:migrate

Bu komut bize oluşturduğumuz modelin veri tabanında bir tablosunu oluşturur. Artık tablonuzu kullandığınız veritabanı yönetim panelinde görebilirsiniz. Veri tabanında yapılan en son işlemi geri almak için aşağıdaki komutları çalıştırabilirsiniz.

sequelize db:migrate:undo 
sequelize db:migrate

Bütün değişiklikleri geri almak için aşağıdaki komutu çalıştırıp bütün değişiklikleri sıfırlayabilirsiniz.

sequelize db:migrate:undo:all
sequelize db:migrate

Bu komutlardan sonra veri tabanınız ilk haline geri dönecektir. Ancak bu durumda elinizdeki test datanız tamamen kaybolacaktır. Bu durumla karşılaşmamak için sequelize üzerinden seederlar oluşturabilirsiniz. Daha sonra bu seederları çalıştırarak tek bir kod ile bütün test datanızı veri tabanına ekleyebilirsiniz. Bunu yapmak için gerekli olan komut aşağıda verilmiştir.

sequelize db:seed:generate --name demo-user

Bu kod parçacığı çalıştığında ‘.sequelizerc’ dosyasında belirlenen seed klasör yolunda bir javascript dosya oluşturacaktır. Bu dosyada ‘up’ fonksiyonunun içerisini kendi tablonuza göre düzenleyip test datanızı oluşturabilirsiniz. Kod örneği aşağıda bulunmaktadır.

'use strict';

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.bulkInsert('Users', [{
       name: 'Burak',
       username: 'brkylmzr',
       email: 'burak.yilmazer@mdpgroup.com',
       password: '123456',
       createdAt: new Date(),
       updatedAt: new Date()
     }], {});
  },
};

Dosyamızı düzenledikten sonra aşağıdaki komutu çalıştırarak tablonuza veri ekleme işlemini gerçekleştirebilirsiniz;

sequelize db:seed:all

Böylece test datanız içeride oluşturulmuş olur. En son seed işlemini geri almak için aşağıdaki komutu yazabilirsiniz;

sequelize db:seed:undo

Belirli bir seed işlemini geri almak için aşağıdaki komut çalışıtırılır;

sequelize db:seed:undo:all

Sequelize CRUD İşlemleri

İlk model oluşturulduğunda model klasörümüzün içerisine index.js isimli bir javascript dosyası oluşturulur. Bu dosya modellerimizi çağırmak için kullanılır. CRUD işlemleri yapacağımız bir javascript dosyası oluşturalım ve bu index.js dosyasını çağıralım.

import db from "../models";

Tablomuza kayıt işlemi yaparak başlayalım. Az önce oluşturduğumuz user modeli yardımıyla tablomuza kayıt ekleyelim. Bu işlem için create fonksiyonu kullanılır. Parametre olarak json yapısında değer alır.

  db.User.create(req.body).then(result => {
    return res.json({
      type: true,
      data: 'Kullanıcı oluşturuldu'
    });
  }).catch(e => {
    return res.json({
      type: false,
      data: e.toString(),
    })
  })

Tablomuzdaki bütün verileri çekmek için endpoint örneği aşağıda bulunmaktadır. Bu işlem için findAll fonksiyonu kullanılır.

  db.User.findAll({}).then(result => {
    return res.json({
      type: true,
      data: result,
    });
  }).catch(e => {
    return res.json({
      type: false,
      data: e.toString()
    })
  })

Tablodan bir veriyi silmek için endpoint örneği aşağıda bulunmaktadır. Örnekte parametre ile gelen id numarasına ait kayıt silinmektedir. Silme işlemi için destroy fonksiyonu kullanılır. Bu örnekte where alanı ile silinecek id numarasını gönderdik. Truncate true gönderilirse tablodaki bütün veriler silinir.

app.delete('/:id', async (req, res) => {
  const id = req.params.id;
  db.User.destroy({where: {id}, truncate: false, cascade: false }).then(result => {
    return res.json({
      type: true,
      data: "Kullanıcı silindi"
    });
  }).catch(e => {
    return res.json({
      type: false,
      data: e.toString(),
    });
  });
});

Tabloda bir veriyi güncellemek için endpoint örneği aşağıda bulunmaktadır. Bu işlem için update fonksiyonu kullanılır. Örnekte parametre olarak gelen id’ye göre güncelleme işlemi yapılır. Parametre olarak güncellenecek olan data json tipinde gönderilir.

app.put('/:id', async (req, res) => {
  const id = req.params.id;
  db.User.update(req.body, {where: {id: id}}).then(result =>{
    return res.json({
      type: true,
      data: "kullanıcı güncellendi"
    });
  }).catch(e => {
    return res.json({
      type: false,
      data: e.toString()
    })
  })
})

Sonuç olarak sequelize bize node.js ile geliştirdiğimiz backend uygulamalara entegre ederek ileride veri tabanı yönetim sisteminizi değiştirmek istediğimizde bütün backend kodlarını değiştirmek yerine sadece hazırladığımız config dosyası değiştirilerek yeni veritabanınızı kullanıma alabilir zamandan tasarruf edebilirsiniz. Bunun yanında birkaç satır kod ile yeni bir model oluşturabilme, seed fonksiyonları ile test datamızı anında oluşturabilme, migration komutları ile en son işlemlerimizi geri alma ve tablolarımızı bir kod satırı ile oluşturabilme kolaylığı sağlanmaktadır. Yukarıda yapılan işlemlere ait kodlara bu github reposundan ulaşabilirsiniz.


Benzer
Bloglar

Mailiniz başarıyla gönderilmiştir en kısa sürede sizinle iletişime geçilecektir.

Mesajınız ulaştırılamadı! Lütfen daha sonra tekrar deneyin.