Sequelize Veri Çekme

Merhabalar, Node.JS yazılarımıza kaldığımız yerden devam ediyoruz. Bu yazımızda Sequelize ile veritabanı tablosundan veri çekmeyi anlatacağım. Hadi başlayalım !
Daha önce Sequelize ile veritabanı bağlantısı yapmıştık, bu yazıya buraya tıklayarak ulaşabilirsiniz.
Veritabanlarında tekli ve çoklu olmak üzere 2 farklı veri okuma yöntemi bulunmakta. Yani örneğin size tek seferde 2 ve üstü sayıda veri gelecekse çoklu, bir tane veri gelecekse tekli okuma yapıyorsunuz demektir. Elbette Sequelize gibi güçlü bir ORM’de bu yapıyı desteklemekte. Hatta öyle ki, tekli ve çoklu veri okuma, limit ve offset ile aralıklı veri okuma, group by ile gruplama yapma, order ile sıralama, attributes ile sadece istenen verileri getirme, include ile join işlemleri yapma gibi bir veritabanında olan tüm işlemler yapılabilmekte.
Sequelize ile tekli ile çoklu veri okuma arasında tek fark kullanılan fonksiyonun adı. Çoklu veri okumak istiyorsanız findAll(), tekli veri okuyacaksanız findOne() fonksiyonunu kullanmanız gerekiyor. Tabi bu fonksiyonları kullanabilmek için bir tane veritabanı modelinizin olması gerekiyor.
Ben Sequelize yazılarımda kullandığım kütüphane veritabanını kullanacağım ve örneğin kayıtlı tüm kitapları getirmek istiyorum diyelim. Sequelize tarafında tablo adını kitaplar olarak belirlemiştim. Bu yüzden tüm kitapları getirmek için şu şekilde bir Javascript kodu yazmam gerekiyor;
const tumKitaplar = kitaplar.findAll();
Bu sayede kayıtlı tüm kitapları çekmiş oldum. Peki sadece bir tane kitap istiyorsak nasıl olacak;
const tumKitaplar = kitaplar.findOne();
Fakat tekli veri çekmeyi genelde filtreleme için kullanıyoruz. Yani örneğin adı Sefiller olan bir kitap var mı diye bakmak istersek kullanıyoruz. Filtreleme işlemini de şu şekilde yapacağız;
const tumKitaplar = kitaplar.findOne({ where:{ kitapAdi: 'Sefiller' } });
Yukarıdaki Javascript kodunun SQL karşılığı şöyle olacaktır;
select kitapId, kitapAdi, isbn, yazarId from kitaplar where kitapAdi='Sefiller' limit 1;
Örneğin yazarları yazdıkları kitapların bilgileriyle beraber getirmek istersek o zaman şöyle bir Javascript kodumuz olacaktır;
const yazarVeKitaplari = kitaplar.findAll({ include: [{ model: yazarlar, as: 'yazarlar' }] });
Bu Javascript kodunun SQL karşılığı ise şöyle olacaktır;
select yazar.yazarId, yazar.yazarAdi, kitaplar.kitapId, kitaplar.kitaAdi, kitaplar.isbn, kitaplar.yazarId from kitaplar left outer join yazarlar on kitaplar.yazarId=yazarlar.id;
Örneğin adı Sefiller olan kitabın yazar bilgilerini getirelim fakat sadece kitapAdi ve yazarAdi bilgilerini getirelim.
const kitap = kitaplar.findOne({
where: { kitapAdi: 'Sefiller' },
include: [{ model: yazarlar, as: 'yazarlar', attributes: ['yazarAdi'] }],
attributes: ['kitapAdi']
});
Örneğin Peyami Safa’nın tüm kitaplarını getirmek istersek yani include ile birleştirdiğimiz tabloda filtreleme yapmak istersek o zaman da şöyle bir Javascript kodu yazmamız gerekecek;
const kitap = kitaplar.findOne({
include: [{ model: yazarlar, as: 'yazarlar', where: { yazarAdi: 'Peyami Safa' }]
});
yazarId değerine göre gruplama yapmak istersek şöyle olacak;
const kitap = kitaplar.findOne({
include: [{ model: yazarlar, as: 'yazarlar' }],
group: ['yazarId']
});
Örneğin sayfalama yapmak istiyoruz, yani tüm veriyi tek seferde değil de 10’ar 10’ar çekmek istiyorsak şöyle olacaktır;
const kitap = kitaplar.findOne({
include: [{ model: yazarlar, as: 'yazarlar' }],
limit: 10,
offset: 0
});
Bu şekilde ilk 10 veri çekilecektir, offset değerini 10 yaparak sonraki 10 (10-20 arasındaki) veriyi, 20 yaparak 20-30 arasındaki veriyi çekebilirsiniz.
Burada bahsettiğim tüm özellikler hem findOne() hemde findAll() fonksiyonuyla beraber kullanılabilmekte.
Ayrıca bunlardan hariç birde findAndCountAll() fonksiyonu var. Bu fonksiyonda tüm veriyi çekiyor ve ayrıca toplam veri sayısını da size söylüyor. Geriye { rows: verinin_tümü, count: toplam_veri_sayısı } şeklinde bir dönüş yapıyor. rows objesi ile verinin tümünü, count objesi ile de toplam veri sayısını öğrenebiliyorsunuz ve rows değeri her zaman dizi olmakta, yani tek veri de olsa çoklu veri de olsa rows değeri dizi olarak dönmekte.
Peki biraz daha ileri götürelim işi ve like, between, in gibi özellikleri de kullanalım. Bunun için Sequelize altında bulunan Op adındaki nesneyi kullanmamız gerekiyor ve bu özellikler sadece where ile filtreleme altında kullanılabilmekte.
Örneğin, adı Peyami olan yazarları getirmek istersek şöyle yapmamız gerekiyor;
const peyamiler = yazarlar.findAll({
where: { yazarAdi: { [Op.like]: 'peyami' } }
});
Örneğin iki tarih arasını filtrelemek istersek o zaman iki yöntemimiz bulunuyor.
const tarihFiltre1 = tablo.findAll({
where: { tarih: { [Op.between]: [tarih1, tarih2] } }
});
const tarihFiltre2 = tablo.findAll({
where: { tarih: { [Op.lte]: tarih1, [Op.gte]: tarih2 } }
});
tarihFiltre1 değişkeniyle yaptığımız işlemde SQL sorgusu tarih between tarih1 and tarih2 şeklinde olacakken, tarihFiltre2 değişkeniyle yaptığımız işlemde ise tarih >= tarih1 and tarih <= tarih2 şeklinde oluşacaktır.
Son olarak, örneğin in işlemi yapmak istiyorsak;
const inFiltresi = tablo.findAll({
where: { tarih: { [Op.in]: [tarih1, tarih2, tarih3, tarih4] } }
});
Bu işlem sonucunda SQL kodu tarih in [tarih1, tarih2, tarih3, tarih4] şeklinde olacaktır.
Evet Sequelize ile veri okuma işlemi bu şekilde olmakta, tüm Node.JS yazılarımıza buraya tıklayarak ulaşabilirsiniz. Herkese hayırlı günler.