Flask SQLAlchemy

Python Flask-SQLAlchemy ORM ile Veritabanı İşlemleri

Python Flask-SQLAlchemy ORM ile Veritabanı İşlemleri

ORM Nedir ?

  • ORM, Object Relational Mapping anlamına gelmektedir.

  • İlişkisel veritabanı (RDBMS) ile nesneye yönelik programların (Object Oriented Programming) arasında bir tür köprü özelliği gören ve ilişkisel veritabanındaki bilgilerimizi yönetmek için, nesne modellerimizi kullandığımız bir tekniktir/metodtur.

SQLAlchemy

  • Python için geliştirilmiş SQL kütüphanesi/paketi ve Object Relational Mapper(ORM) aracıdır.

Veritabanı Modeli

veritabani

  • Modelde gördüğünüz varlıklar (entity) arasındaki ilişki aşağıdaki gibi olacaktır:

    • Teacher & Student Many To Many
    • Teacher & Lecture One To One
    • Teacher & Book One To Many
  • models.py adında bir python dosyası oluşturalım.

  • Flask ve SQLAlchemy sınıflarından nesneleri oluşturup konfigürasyonu yapalım.

 
  • Projede SQLite veritabanı kullanıyoruz. MySQL, PostgreSQL kullanacaksanız önce veritabanını (database schema) oluşturmalısınız.

  • SQLite Veritabanı adına veritabani.db adını verdik.

  • Many To Many ilişkileri veritabanında kullanabilmek için One To Many ilişkilerine dönüştürüyoruz. Bunun için bir yardımcı tabloya ihtiyacımız var.

  • Modelde göreceğiniz StudentTeacher tablosu yardımcı tablodur.

 
  • db.Table() sınıfı ile model olmayan tablo oluşturabiliyoruz.

    • İlk parametre StudentTeacher tablo adı.

    • db.Column() ile kolon oluşturuyoruz.

      • İlk parametre student_id kolon adı.

      • db.Integer veri tipinin integer (tamsayı) olacağını belirtiyor.

      • db.ForeignKey() sınıfı ile Dış Anahtar(Foreign Key) oluşturuyoruz.

        • student.id; Student isimli tablonun id'sini belirtiyor.
      • primary_key=True diyerek birincil anahtarı belirtiyoruz.

Student Modeli
 
  • Student(db.Model); db.Model sınıfını miras alıyor.

  • id; db.Column ile kolon oluşturuyoruz.

  • name; db.String(50), 50 karakterlik bir string alabileceğini belirtir.

    • nullable=False diyerek, name değerinin boş bırakılamayacağını belirtiyoruz.
  • teachers class attribute(sınıf niteliği); db.relationship() ile bir ilişkinin oluşturulacağını belirtiyoruz. db.relationship() ile veritabanında kolon(attribute) oluşturulmaz.

    • db.relationship(); ilk parametresi 'Teacher' ile hangi model class ile ilişki kuracağımızı belirtiyoruz.

    • secondary=student_teacher diyerek yardımcı tablomuzu da ilişkiye dahil ediyoruz(Many To Many için gerekli!).

    • lazy parametresi verinin database'den nasıl yükleneceğini belirtir.

      • lazy='dynamic' dediğimizde database query'yi (veri tabanı sorgusunu) parça parça yapabiliriz. Filtreleme(filter_by), sıralama(order_by) yapabiliriz.
      • lazy='select' ile tek seferde bütün datayı veritabanından standart select gibi almak için kullanılır. (select, True olarak da belirtilebilir.)
      • lazy='joined' ile veriyi tek seferde JOIN olarak almak için kullanılır. select ile dynamic kombinasyonu gibidir. (joined, False olarak da belirtilebilir.)
      • lazy='subquery', joined gibidir.
    • backref ile ilişki kurduğumuz model class'a bir tane property(özellik) ekliyoruz. Böylece ilişki kurduğumuz Teacher sınıfından db.backref('students') içindeki 'students' diyerek öğretmenin öğrencilerini görebiliriz.

  • __repr__(self) özel bir methoddur. Model class'tan nesne oluşturulduğunda sınıf adını ve methodda belirttiğimiz self.name in değerini ekrana basar. Aşağıdaki gibi.

 
Teacher Modeli
 
  • lecture_id; Lecture model sınıfının id'sini tutacak sınıf niteliği.

  • db.relationship(..., uselist=False, lazy=False);

    • uselist=False : One to One ilişkide kullanmak için belirtildi.
    • lazy=False, lazy='joined' demektir.
    • back_populates; backref gibidir.
  • backref parametresinin ve db.backref() methodunun kullanımına dikkat ediniz.

Lecture ve Book Modeli
 
Shell ortamında çalışırken import ederken kolaylık olması için;
 
  • $ export FLASK_APP=models.py dedikten sonra $ flask shell diyerek shell ortamında çalışabilirsiniz.

Shell ortamında işlemler

 
  • Bu işlemlerden sonra veritabanı tabloları: book

student


teacher


lecture


 

student_teacher

 

book2

  • Design Patterns and Clean Code kitabını Şadi Evren Şeker'e atayalım.
 

book3

 

teacher2

 

teacher3

  • Dersi en son kime atadıysak onda kalır. One To One gereği!

backref'i daha fazla açıklarsak.

  • backref kullandığınızda, 2 tablo arası ilişkide, 2. tabloda db.relationship yapmanız gerekmiyor.
  • Student sınıfında ufak bir değişiklik yapalım.
 
  • students yerine ogrenciler yaptık sadece! Aşağıdaki kodlara dikkat edelim.
 
  • backref sayesinde teacher1.ogrenciler diyerek veya aşağıdaki gibi book1.author diyerek ilişkili tablonun verisine erişebiliyoruz.
 
 

Yorumlar