Modül 5 · Analitik Mühendisliği (dbt) · ⏱ 7 dk

Sources, models, seeds, tests, docs

dbt sources-models-seeds-tests

Bu derste neler öğreneceksin

  • Source tanımlar
  • Seed verisi ekler
  • Test yazar + dökümante eder

Tarif Defterinin Sayfaları

Annenin defterinde her tarifin bir adı (Mercimek çorbası), malzemeleri (1 bardak mercimek), yapılışı (kaynat, ez), ve bazen yanına küçük notlar var (“tuzunu az koy, kaynamasın”). dbt’de de her modelin sayfası öyle: adı, kaynak verisi, sorgusu, testleri, açıklaması. Bu derste sayfaları nasıl düzenli tutarsın öğreniyoruz.

Sources: “Malzemeler Nereden Geliyor?”

Bir tarif yazarken “şu tabloyu kullan” demek yerine source tanımlarsın. Neden? Çünkü yarın o tablonun adı değişirse, tek bir yerde düzeltirsin, 50 modele dokunmazsın.

models/staging/ klasörüne sources.yml dosyası aç:

version: 2

sources:
  - name: raw
    database: my-limonata-lab
    schema: raw_data
    tables:
      - name: siparisler
        description: "Günlük limonata satış siparişleri"
        columns:
          - name: siparis_id
            description: "Benzersiz sipariş kimliği"
            tests:
              - unique
              - not_null
          - name: musteri_id
            description: "Müşteri kimliği"
            tests:
              - not_null
          - name: toplam_tutar
            tests:
              - not_null

Şimdi modellerinde şöyle çağırırsın:

SELECT * FROM {{ source('raw', 'siparisler') }}

source fonksiyonu otomatik my-limonata-lab.raw_data.siparisler adresine çevirir. Yarın şema adı değişse sources.yml’de tek satır günceller, hepsi çalışır.

Seeds: “Annemin El Yapımı Tarifleri”

Bazen küçük, statik veriler vardır: ülke listesi, ürün kategorileri, mağaza adları. Bunları her seferinde veritabanından çekmek yerine bir CSV olarak projeye eklersin. dbt bunu tabloya yükler.

seeds/ulkeler.csv:

ulke_kodu,ulke_adi
TR,Türkiye
DE,Almanya
US,Amerika
NL,Hollanda

Sonra:

dbt seed

dbt bu CSV’yi raw_data.ulkeler tablosu olarak yükler. Artık JOIN’lerde kullanabilirsin.

Kural: Seed sadece küçük (< 10.000 satır) ve nadiren değişen veriler için. Milyon satırlık müşteri listesini seed yapma.

Tests: “Tarif Bozulmamış mı?”

Annenin defterinde bazen yanında not vardır: “Bu tarif en az 2 kişiliktir” veya “glütensizdir”. dbt’de test, model çıktısının bazı kurallara uyup uymadığını kontrol eder.

İki tür test var:

1. Built-in testler (şema dosyasına yazılır):

models:
  - name: gunluk_siparis
    columns:
      - name: gun
        tests:
          - unique
          - not_null

Bu, “her gün yalnız 1 satır olmalı” ve “tarih boş olmamalı” demek. dbt test çalıştırınca PASS/FAIL döner.

2. Custom test (tests/ klasörüne):

-- tests/ciro_pozitif_mi.sql
SELECT *
FROM {{ ref('gunluk_siparis') }}
WHERE ciro < 0

Eğer sorgu herhangi bir satır dönerse test FAIL olur — yani “negatif ciro var, bir şeyler yanlış!”.

Docs: “Yemek Tanımı”

dbt, her model için yazdığın description’ları toplayıp güzel bir katalog sitesi oluşturur. Bu derste kısaca değinelim, sonraki derste dbt docs’u öğreniyoruz.

models/marts/gunluk_siparis.yml:

models:
  - name: gunluk_siparis
    description: "Her gün için sipariş sayısı ve ciro özeti"
    columns:
      - name: gun
        description: "Yıl-ay-gün formatında tarih"
      - name: ciro
        description: "TL cinsinden o günün toplam cirosu"

Ne Öğrendik?

  • Source: Ham tablonun adresini tek yerde tanımla, modellerde {{ source() }} ile çağır.
  • Seed: Küçük statik CSV’leri dbt seed ile tabloya yükle.
  • Test: unique, not_null gibi built-in testler + custom SQL testleri ile veri kalitesini otomatik kontrol et.
  • Doc: Her modele ve sütuna description yaz, dbt bunları toplayıp katalog üretir.

Küçük Ödev

  1. sources.yml dosyasına musteriler tablosu için iki sütun (unique, not_null) testi ekle.
  2. seeds/icecek_kategorileri.csv oluştur (3 satır: Klasik, Özel, Mevsim), dbt seed çalıştır.
  3. dbt test ile tüm testleri geçir.

Sıradaki

Macros (Jinja tarifleri) ve topluluk paketleri →