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 seedile tabloya yükle. - Test:
unique,not_nullgibi built-in testler + custom SQL testleri ile veri kalitesini otomatik kontrol et. - Doc: Her modele ve sütuna
descriptionyaz, dbt bunları toplayıp katalog üretir.
Küçük Ödev
sources.ymldosyasınamusterilertablosu için iki sütun (unique,not_null) testi ekle.seeds/icecek_kategorileri.csvoluştur (3 satır: Klasik, Özel, Mevsim),dbt seedçalıştır.dbt testile tüm testleri geçir.