Merhaba django(drf) ile bir proje yapıyorum. Bunun için bir dış kaynaktan (mssql) veri çekip pandas ile düzenleyip api sunuyorum.
Projeyi farklı veri kaynakları eklenebilir şekilde ayarladım; eğer istenirse rdms verileri eklenerek ve query için istenen veriler tanımladığım sınıfların yeni nesnelerine eklenerek (yeni bir instance oluşturarak) farklı kaynaklardan veri çekilmesi sağlanabiliyor.
Ancak şöyle bir sıkıntım varki her seferinde iki milyon satır ve 50 sütun (sütunu azaltıp ihtiyaç duyduğum kadarını çekebiliyorum) veri çekmek üç dört dakika sürüyor ki bu da projeyi kullanışsız hale getiriyor.
Bunun için verileri çekip bu verinin sütun başlıklarını field* olarak ayarlayacağım yeni bir class oluşturmak ve o class ile kendi veritabanımda saklamak istiyorum. Her satırda bir nesneye dönüşecek.
Koda müdahale etmeden nasıl yapabilirim sorusu aklıma fonksiyonlar için kullanılan closure konusunu getirdi buna benzer bir yapıyla class üretebilir miyim?
Ya da django da bütün bir tabloyu (iki milyon satırı) tek bir nesne içerisinde saklayabilir miyim?
Ya da hız problemi için farklı bir öneriniz olur mu?
*-> türkçe karakterlerle ilgili de sıkıntım olacak. field isimlerini maketrans ile vb. türkçe karakterlerden arındırsam da sonra geri çevirmem de gerekebilir.
ürün | müşteri | tarih | tutar
elma | ali | 2020 | 10.00
armut | veli | 2021 | 12.00
üzüm | fatma | 2021 | 16.00
nihayetinde şöyle bir class oluşturacağım
class Satis(models.Model):
urun = models.CharField(max_length=20)
musteri = models.CharField(max_length=20)
tarih = models.CharField(max_length=20)
tutar = models.CharField(max_length=20)
Veri kaynağı oluşturulduğunda bir signal tetikleyecek ve yukarıda misalen ‘Satis’ olarak adlandırdığım classa benzer bir class oluşturacak. fieldleri de setattr() kullanarak ekleyeceğim.
Bundan sonra veri çekmek isteğimde bu yeni oluşturduğum class ı kullanarak verileri çekeceğim.
Şu an aklıma geldi ki bir de migrate problemim olur. Belki alternatif bir çözüm daha iyi olabilir.
Hacim veriyi başka bir yere basıp çekmek yerine sorguları optimize etmek daha mantıklı olur. ORM, veri tabanından bağımsız ortak bir sorgulama mantığı üzerine kurulu. Tabii, django.db arka tarafta senin için bağlantı optimizasyonlarını (session pooling vs) hallediyor diye biliyorum. Yine de bir view üzerinden veri çekmekle tablodan çekmek arasında bayağı fark oluyor. Çekeceğin veriler JOIN içeriyorsa mesela, bu sorgu dönüşünü yavaşlatır. Ben birden fazla tabloyu birlikte kullanacaksam materialized view gibi seçenekleri de göz önünde bulunduruyorum mesela. Her şeyi programlama tarafında halletmeye çalışmak yorucu oluyor.