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.
İçindekiler
Ş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" } }
“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"
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
İ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.
Software Developer
Dijital Dönüşüme Koronavirüs İvmesi
Fransız edebiyatçı Alfred de Musset'nin “bütün zorlukların ortasında, fırsatlar yatar” sözünü, Covid19 döneminde dijitalleşme...
SAP EWM’de Fiori Arayüzü: Yeni Nesil Kullanıcı Deneyimi
Dijital dönüşüm süreçlerinde kullanıcı deneyimi artık yalnızca bir “güzellik” unsuru değil, aynı zamanda verimliliği ve kullanıcı...
Fintech Çözümlerinin Önemi
FinTech yani finansal teknolojiler kapsamı günden güne genişlemeye devam ediyor. Finansal teknolojilere olan talep 2020 yılında özellikle...
İnsan Kaynaklarında Dijital Dönüşüm
Dijital dönüşüm, gün geçtikçe tüm alanlarda daha önemli bir hale gelmektedir. Dijital dönüşüm, organizasyonların iş süreçlerine...
Gelen e-Arşiv Fatura Çözümü Ne İşe Yarar?
01/01/2024 tarihinden itibaren e-Fatura uygulamasına geçmemiş mükelleflerin diğer vergi mükelleflerine kestikleri 6.900 TL üzerindeki...
SAP Integration Suite’de Groovy Scripting
Groovy ve Groovy Script Nedir? Groovy, Java platformu için çok yönlü ve güçlü bir dildir. İsteğe bağlı tiplenebilirlik ve dinamik...
Neden SAP Integration Suite Kullanmalısınız?
Başarılı bir şirketin temeli olan entegrasyon, şirketler için en önemli stratejik önceliğe sahiptir. Bunun nedeni ise, şirketlerin sahip...
E-Gider Pusulası Nedir?
Günümüzde bir işin hızlı olması daha da önem kazanmıştır. Artık insanlar basit işlere uzun zamanlar harcamaktansa bu işlerini hızlıca...
Kur Farkı Nedir? SAP Kur Farkı Faturası Çözümü
Yerli para biriminin yabancı para birimine göre fiyatına “kur” denir. İki para biriminin birbiriyle değiştirilmesi sırasında ortaya...
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.