Node.JS

Node.JS Sequelize Bağlantısı Yapma

Herkese merhaba, Node.JS derslerimize kaldığımız yerden devam ediyoruz. Bu dersimizde Sequelize ile veritabanı bağlantısı kurmayı anlatacağım. Hadi başlayalım !

Öncelikle tabiki bir tane Node.JS projesi oluşturmamız gerekiyor. Bunun için projeyi oluşturmak istediğiniz klasöre terminal (Windows için CMD) ile geçip

npm init --yes

komutunu çalıştırmamız gerekli. Ardından Npm projeyi oluşturacaktır. Sequelize kullanacağımız ve Node.JS’in kendi paketlerinden olmadığı için bu paketi de yüklemeli ve projemize dahil etmeliyiz. Bunun için yine terminal üzerinden

npm i sequelize

komutunu çalıştırmamız yeterli.

Sequelize ile veritabanı bağlantısı yapacağız ama Sequelize’ın şöyle bir güzelliği var; hazırda veritabanı olmasına gerek yok, biz veritabanı bilgilerini girdiğimizde belirttiğimiz veritabanı varsa doğrudan bağlantı kuruluyor, veritabanı yoksa oluşturulup bağlantı yapılıyor. Veritabanını elle oluşturmamıza gerek yok dedik ama tabloları bilmemiz gerek, yani veritabanının yapısını bilmeliyiz. Tablolar ve yapılarını da JavaScript tarafında oluşturacağız ve ilgili tablo yoksa Sequelize tarafından oluşturulacak.

Örneğin kutuphane adında bir tane veritabanımız ve bu veritabanında da kullanicilar ve kitaplar adında iki tablo olsun. kullanicilar tablosunda integer tipte ve primary key olan kullaniciID, varchar tipte 255 karakterle sınırlı kullaniciAdi ve varchar tipte 255 karakterle sınırlı sifre sütunları olsun. kitaplar tablosunda ise integer tipte ve primary key olan kitapID, varchar tipte 255 karakterli kitapAdi, varchar tipte 20 karakterli isbn, varchar tipte 255 karakterle sınırlı yazarAdi sütunları olsun. Ayrıca kitapAdi, isbn ve yazarAdi değerleri boş geçilemez olsun. Bu verilere göre veritabanını kuralım.

Öncelikle veritabanı tabloları ve yapılarını Sequelize ile oluşturalım. Sequelize’da her tablo ayrı bir JavaScript dosyasında oluşturulmalıdır. Bizim iki tane tablomuz olduğu için ve bunların veritabanı modeli olduğunu ayırt edebilmek için models adında bir klasör oluşturarak içine kullanicilar.js ve kitaplar.js adında iki dosya oluşturalım ve kullanicilar.js dosyasına giriş yapalım. Bir veritabanı tablosunda bulunan sütunların veritiplerini Sequelize modülü altında bulunan DataTypes sınıfı ile atayabiliyoruz. Tabloyu oluşturmak içinde Sequelize sınıfını kullanacağız. Yani kullanicilar.js dosyasında öncelikle DataTypes ve Sequelize sınıflarını çağırmamız gerekli. Bunun için sayfanın başına

const Sequelize, { DataTypes } = require('sequelize');

kod satırını yazalım. Artık Sequelize kullanmaya hazırız 🙂

Bildiğiniz üzere Node.JS’de bir fonksiyon, sınıf yada modülü farklı bir dosyada kullanabilmek için o modül, fonksiyon yada sınıfı export etmemiz gerekiyor. O yüzden bu sayfada yazacağımız kodları export etmemiz gerek ve tablo yapısını da fonksiyon şeklinde oluşturmalıyız (Sequelize böyle istiyor).

Tabloyu oluştururken de Sequelize sınıfı altında define() metoduna önce string olarak tablo adını, sonrada object olarak tablo yapısını göndermemiz gerek ve her bir sütun bir object olmalı. Şimdi kullanicilar tablosunu oluşturalım.

module.exports = {
    kullanicilar: () => {
        const kullanici = Sequelize.define('kullanicilar', {
            kullaniciID: {
                type: DataTypes.INTEGER,
                primaryKey: true
            },
            kullaniciAdi: {
                type: DataTypes.STRING(255),
            },
            sifre: {
                name: 'sifre',
                type: DataTypes.STRING(255)
            }
        });
        return kullanici;
    }
}

Evet kullanicilar tablomuzu oluşturduk. Şimdi de kitaplar tablomuzu oluşturalım. kitaplar tablosunda kullanicilar tablosundan farklı olarak kitapAdi, isbn ve yazarAdi alanları boş geçilemez olacak. Sequelize’da bunu sağlamak için sütun bilgilerini girerken allowNull özelliğini değiştirmemiz gerekiyor. Bu özellik true yada false değer alıyor ve true ise boş geçilebilir, false ise boş geçilemez anlamına geliyor. Default olarak true olduğundan kullanıcılar tablosundaki kullaniciAdi ve sifre alanları boş geçilebilir özellikteki sütunlar için ayrıca belirtmemize gerek yoktu fakat kitaplar tablosunda belirtmemiz gerekecek. Hadi şimdi tablo yapısını oluşturalım;

module.exports = {
    kitaplar: () => {
        const kitap = Sequelize.define('kitaplar', {
            kitapID: {
                type: DataTypes.INTEGER,
                primaryKey: true
            },
            kitapAdi: {
                type: DataTypes.STRING(255),
                allowNull: false
            },
            isbn: {
                type: DataTypes.STRING(20),
                allowNull: false
            },
            yazarAdi: {
                type: DataTypes.STRING(255),
                allowNull: false
            }
        });
        return kitap;
    }
}

Evet tablolarımızı oluşturduk, şimdi veritabanı oluşturma ve Sequelize ile bağlantı kurmaya geçelim. Bunun için models klasörü içeriside bir tane index.js adında Javascript dosyası oluşturup açalım. Dosyanın adının index.js olmasının sebebi, bir model dosyası olmadığını, modelleri yönettiğimiz ve Sequelize içerisinde doldurduğumuzu belirtmek. Bu dosyada da Sequelize kullanacağımız için modülü sayfada çağıralım. Ayrıca az önce tablolar için oluşturduğumuz dosyalara da erişmemiz gerekecek çünkü Sequelize modelimize eklememiz gerek (yoksa Sequelize tabloları nerden bilecek dimi 🙂 ) Node.JS’de dosya işlemleri için fs modülü kullanıldığından bu modülüde sayfada çağırmamız gerek. Son olarak dosya yollarını daha efektif ve işletim sistemine göre doğru bir şekilde birleştirebilmek için path modülünü kullanacağız. O yüzden bu modülü de çağırmamız gerek. fs ve path modülleri Node.JS’in standart modüllerinden olduğu için kurmamıza gerek yok. Modülleri çağırmak için sayfanın başına

const Sequelize = require('sequelize');
const fs = require('fs');
const path = require('path');

kodlarını ekleyelim.

Sequelize modelini oluşturup bağlantıyı yapacağımız kodları da fonksiyon içine alıp export ederek diğer sayfalarda kullanabilir hale getirelim. Sequelize modelini oluşturmak için Sequelize sınıfından yeni bir nesne türetmeli ve veritabanı bağlantı bilgilerini tanımlamamız gerekiyor. Ardından oluşturduğumuz bu modele tablo yapısını oluşturduğumuz dosyaları da ekleyeceğiz. Son olarakta bu modeli geri döndürerek dışarıdan ulaşılabilir hale getireceğiz ve farklı bir dosyada da veritabanına bağlantı yapacağız.

Bir veritabanına bağlantı yapabilmek için o veritabanının sunucu adresi, sunucuya giriş için kullanıcı adı ve şifresini, sunucunun port numarasını ve son olarakta veritabanı adını bilmemiz gerekiyor. Sequelize ile bağlantı kurabilmek içinde bu bilgileri kullanacağız ve Sequelize nesnesi oluştururken bu değerleri parametre olarak göndereceğiz. Bu kadar teknik ve teorik bilgiden sonra kodları şu şekilde yazalım;

function models() {
    const database = {};
    let sequelize = new sequelize({
        host: 'localhost',
        port: 3306,
        dialect: 'mysql',
        database: 'kutuphane',
        user: 'root',
        password: '',
        define: {
            freezeTableName: true
        }
    });
    fs.readdirSync(__dirname).forEach(file => {
        const model = require(path.join(__dirname, file));
        database[model.name] = model;
    });
    Object.keys(database).forEach(modelName => {
        if (database[modelName].associate)
            database[modelName].associate(database);
    });
    database.sequelize = sequelize;
    database.Sequelize = Sequelize;
    return database;
}
exports.models = models;

Evet Sequelize modelimizi ve tablolarımızı da bu şekilde oluşturduk fakat Sequelize nesnesi oluştururken dialect adında bir obje gönderdik. O ne derseniz, Sequelize; Mysql, Mssql, MongoDB gibi birçok veritabanı çeşidi ile bağlantı kurabiliyor ve kullanabiliyoruz. dialect objesi ile bağlantı yapmak istediğimiz veritabanı tipini belirtiyoruz. Yani dialect olarak mysql gönderdiğimizde ‘bak ben Mysql bilgileri gönderdim, sende Mysql’e göre işlem yapacaksın’ demiş oluyoruz. Ayrıca normalde Sequelize, diğer birçok ORM gibi tablo isimlerinin sonuna s takısı ekliyor. Yani biz kullanicilar ve kitaplar diye iki tablo oluşturduk ama Sequelize bu tabloları oluştururken kullanicilars ve kitaplars isimleriyle oluşturacaktı. define özelliği ve onun içindeki freezeTableName özelliğini true yaparak tablo isimlerine eklenecek olan s takılarını kaldırıyoruz. Yani bizim tablolarımız kullanicilar ve kitaplar adıyla oluşturulacaktır.

Sequelize modelimizi oluşturup, tablolarımızı içine eklediğimize göre artık bağlantıyı yapabilir ve veritabanını oluşturabiliriz. Veritabanı bağlantısı yapabilmek için örneğin connection.js adında bir dosya oluşturalım ve az önce Sequelize modelini oluşturduğumuz models klasörü altındaki index.js dosyasını çağıralım. Yani sayfanın başına

const models = require('./models');

kod satırını yazalım. Sequelize ile veritabanını oluşturmak için model içerisinde bulunan sequelize özelliğinin sync() metodunu çağırmamız gerekiyor. Adının açılımından da (synchronize) anlaşılacağı üzere bu metod veritabanını senkronize ediyor ve veritabanı ve tabloları yoksa oluşturuyor. Ayrıca bu metod bize Promise döndürdüğü için oluşabilecek hatalarıda yakalayabiliyoruz. Kullanımı da şöyle olsun;

models().sequelize.sync().then(() => { console.log('Veritabanı oluşturuldu ve bağlantı sağlandı.') }).catch(error => { console.error(error); });

Evet şimdi veritabanı tarafını hallettik, artık sıra geldi Sequelize ayarlarına. İlk olarak Sequelize ile bağlantı yapacağımız veritabanı bilgilerini girmemiz gerekiyor. “E az önce models klasörü altındaki index.js dosyasında yeni bir Sequelize nesnesi oluştururken bunu zaten yaptık” diyebilirsiniz fakat orada model yapısı için veritabanı bağlantı bilgilerini girdik, burada Sequelize için gireceğiz. Ana dizinde bir tane config.js adında Javascript dosyası oluşturalım ve index.js dosyasında Sequelize nesnesi oluştururken verdiğimiz objeyi aynen dışarı export edelim. Sequelize bu dosyayı okuyacak ve buna göre veritabanına bağlantı yapacaktır.

module.exports = {
    host: 'localhost',
    port: 3306,
    username: 'root',
    password: '',
    database: 'kutuphane',
    dialect: 'mysql'
};

Buraya kadar Sequelize ayarlarını yaptık ama hepsi farklı farklı yerlerde, yani hangi dosya ne için dışarıdan bakan birinin bile anlaması zor olabilecekken Sequelize’ın anlaması çok daha zor bi durum 🙂 Bunun için Sequelize tüm bu ayarları .sequelizerc adında bir dosyada istiyor. Yani .sequelizerc dosyasına hangi dosyanın ne işe yaradığını yazıyoruz, Sequelize .sequelizerc dosyasını okuyarak neyin ne olduğunu kolaylıkla anlayabiliyor. Unutulmaması gereken şey ise, .sequelizerc dosyasının proje ana dizininde bulunması gerekiyor, farklı bir yere koyarsanız Sequelize dosyayı okuyamayacak ve işlevsiz olacaktır. .sequelizerc dosyasının yazımı da Javascript ile yapılıyor ve Node.JS’deki gibi dışarıya export edilmesi gerekiyor. export edilecek veriler arasında ise veritabanı bağlantı bilgilerinin bulunduğu config.js dosyasının yolu, veritabanı modellerinin bulunduğu klasorün yolu, migration dosyalarının bulunduğu klasörün yolu, seeders dosyalarının bulunduğu klasörün yolu bulunmakta. config.js dosyasının yolu ve modellerin bulunduğu klasörün yolunu biliyoruz ama migration dosyaları ve bunların yolu, seeders dosyaları ve bunların yolu nedir ? ORM’ler veritabanı modellerini nasıl oluşturursanız veritabanını o şekilde kurar fakat modelde yapılacak bi değişikliğin geçerli olabilmesi için ya veritabanını kaldırıp tekrardan kurmalısınız, yada migration dosyası oluşturarak veritabanındaki değişiklikleri belirterek veritabanını kaldırmadan değişiklikleri uygulamalısınız.

Test ortamında belki veritabanını kaldırıp tekrardan kurma işlemi yapılabilir fakat canlıya geçtiğinizde ve veritabanında veri varsa bu çok mantıksızca bir seçim olacaktır. O yüzden migration kullanmak önemli 🙂 Seeders ise veritabanı oluşturulduğu anda default olarak eklenmesini istediğiniz verileri ekletebildiğiniz dosyalar. Yani örneğin veritabanını kurduğunuz anda admin adında bir kullanıcı eklemek istiyorsanız seeders ile ekleme işlemini yapmalısınız. Sequelize veritabanını oluşturduğu anda seeders dosyalarını çalıştırdığı için default olarak eklenmesini istediğiniz verilerde eklenecektir.

.sequelizerc dosyasında migrations ve seeders dosyalarının bulunduğu klasörün yolunu belirtmelisiniz dedik ama bu klasörlerin var olan klasörler olması gerek. Yani oralara yazacağınız yollarda bi klasör oluşturmalısınız. Örneğin biz ana dizinde migrations ve seeders adında klasörler oluşturup bunları kullanalım. Son olarak .sequelizerc dosyamızı şu şekilde yazalım;

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

Eveeet Sequelize ile Javascript tarafında yapacağımız işlemler bu kadardı. Sıra geldi artık veritabanını oluşturmaya. Bunuda terminal ile yapacağız çünkü artık Javascript ile işimiz yok, burada Npx ve sequelize komutlarını kullanacağız. Npx, Node.JS kurulumu ile beraber gelen Npm gibi terminalden çalıştırılabilir bir komut ve ara komut çalıştırmamıza olanak sağlıyor. Yani mesela terminalde doğrudan sequelize komutunu çalıştıramayız fakat npx sequelize şeklinde çalıştırmak mümkün. Sequelize ile veritabanı ve tablolarını oluşturmak içinde npx ve sequelize komutlarını kullanacağız. Sadece veritabanını kurmak istiyor, tabloları kurmak istemiyorsanız

npx sequelize db:create

Veritabanı ile beraber tabloları da oluşturmak istiyorsanız

node ./connection.js

Veritabanına migration eklediğinizde çalıştırmak istiyorsanız

npx sequelize db:migrate

Veritabanını kaldırıp, tabloları oluşturarak migration ve seedersları çalıştırmak istiyorsanız

npx sequelize db:drop && npx sequelize db:create && node ./connection.js && npx sequelize db:migrate && npx sequelize db:seed:all

komutunu çalıştırmanız gerekmektedir.

Evet Sequelize ile bağlantısı yapma bu kadardı. Biraz uzun bir yazı oldu ama faydalı olması dileğiyle. Tüm Node.JS derslerimize buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.

Skorumuz:
Oy Vermek İçin Tıklayın
[Toplam: 0 Ortalama: 0]

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu