Flask-Seeder ile Test Verisi Yükleme

Seeding, veritabanına test verisi yüklemek için kullanılan özelliklere verilen isimdir. Proje test aşamasında iken Seeder’lar kullanılarak uygulamaya test verileri yüklenir. Böylece her test işlemi sırasında verilerin tek tek girilmesi zahmetinden bizi kurtarır.

Flask-Seeder Kurulumu ve Yapısı

Bunun için hazır bir kütüphane mevcut, bu kütüphaneyi kullanabiliriz. Paket yöneticimizden rica edip kurulumu yapıyoruz. 🙂

~$ pip install Flask-Seeder

Bu komut bizim için Flask-Seeder kurulumunu yapacak ve flask seed alt komutunu ekleyecektir.

Yapı olarak bizim seeder dosyaları, proje dizininin altındaki seeds/ klasöründe bulunur. Başka dizinlerdeki seeder dosyaları işleme alınmayacaktır.

Biz seeder dosyalarını işleme koyduğumuzda, başarılı olsun ya da olmasın, bütün işlemler veri tabanına kaydedilir. Eğer test işlemi yapıyorsak (verilerin veritabanına kaydedilmemesini istiyorsak) --no-commit komutunu beraberinde vermemiz gerekiyor ya da ortam değişkeni olarak FLASK_SEEDER_AUTOCOMMIT=0 değerini tanımlamamız gerekiyor.

Faker

Bizim için gerçek sınıflara dayalı fake, yani sahte veriler üreten sınıftır. Şimdilik desteklediği türler aşağıdaki şekildedir:

Integer: İki değer aralığında tam sayı üretir.
Sequence: Birden fazla çağrılırsa sıralı tam sayılar üretir.
Name: data/names/names.txt dizininden rastgele seçim yaparak isim üretir.
String: Bir desene bağlı olarak karakter dizisi oluşturur.

Örnek Uygulama

Aşağıda örnek bir app.py dosyası mevcut.

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_seeder import FlaskSeeder

def create_app():
  app = Flask(__name__)

  db = SQLAlchemy()
  db.init_app(app)

  seeder = FlaskSeeder()
  seeder.init_app(app, db)

  return app

Ve aşağıdaki de bizim örnek seeder dosyamız, seeds/demo.py dosyası.

from flask_seeder import Seeder, Faker, generator

# SQLAlchemy Veritabanı Modelimiz
class User(Base):
  def __init__(self, id_num=None, name=None, age=None):
    self.id_num = id_num
    self.name = name
    self.age = age

  def __str__(self):
    return "ID=%d, Name=%s, Age=%d" % (self.id_num, self.name, self.age)

# Bütün seeder'lar, Seeder sınıfından miras alır (kalıtım)
class DemoSeeder(Seeder):

  # Flask-Seeder tarafından çağrılacak olan varsayılan fonksiyonumuz.
  def run(self):
    # Faker ile fake (sahte) kullanıcılar oluşturuyoruz. User modelini baz aldığımızı söylüyoruz.
    faker = Faker(
      cls=User,
      init={
        "id_num": generator.Sequence(),
        "name": generator.Name(),
        "age": generator.Integer(start=20, end=100)
      }
    )

    # 5 Kullanıcı Oluştur
    for user in faker.create(5):
      print("Adding user: %s" % user)
      self.db.session.add(user)

Görüldüğü gibi oldukça basit, şimdi terminal üzerinden komut vererek seeder dosyamızı çalıştırıyoruz.

~$ flask seed run
Running database seeders
Adding user: ID=1, Name=Fancie, Age=76
Adding user: ID=2, Name=Shela, Age=22
Adding user: ID=3, Name=Jo, Age=33
Adding user: ID=4, Name=Laureen, Age=54
Adding user: ID=5, Name=Tandy, Age=66
DemoSeeder... [OK]
Committing to database!

Hepsi bu kadar. Kolay gelsin!

Leave a comment