Macros & Packages
Macros and Packages
Bu derste neler öğreneceksin
- Jinja macro yazar
- dbt_utils paketi kullanır
- Topluluk paketlerini keşfeder
Tarifleri Tekrar Tekrar Yazma
Annen her çorba tarifinin altına “tuz ve karabiber ekle” yazmıyor — bunlar ortak adımlar. “Çorba tarifi”nin sonuna “baharat ekle” diye küçük bir not düşüyor, her tarifte uyguluyor.
dbt’de macro = ortak SQL parçası. Bir kez yazarsın, yüz modelde çağırırsın. Macro dili Jinja — süslü parantez {{ }} ve yüzde {% %} ile yazılır.
İlk Macro: “tarihi düzgün göster”
macros/tarih_formatla.sql:
{% macro tarih_formatla(alan) %}
CAST({{ alan }} AS DATE FORMAT 'YYYY-MM-DD')
{% endmacro %}
Şimdi bir modelde kullan:
{{ tarih_formatla('siparis_tarihi') }} AS siparis_gunu
dbt bunu derlerken:
CAST(siparis_tarihi AS DATE FORMAT 'YYYY-MM-DD') AS siparis_gunu
olarak değiştirir. Yarın formatı DD/MM/YYYY yapmak istersen macro’yu bir yerde değiştirirsin, 50 modele yeniden dokunmazsın.
Macro İçinden Macro Çağırmak
Macroların içinde başka makroları çağırabilirsin:
{% macro haftalik_ozet(tablo) %}
SELECT
DATE_TRUNC({{ tarih_formatla(tablo) }}.tarih, WEEK) AS hafta,
COUNT(*) AS kayit_sayisi
FROM {{ tablo }}
GROUP BY 1
{% endmacro %}
Packages: “Komşunun Tarif Defteri”
Annen bazen komşudan tarif ödünç alır: “Komşu Hanım’ın browni tarifi harika!” Aynı şekilde dbt dünyasında insanlar paket yayınlar: hazır macro’lar, hazır testler, hazır modeller.
En ünlü paket: dbt_utils. İçinde 100+ yararlı macro var.
Paket Kur
packages.yml:
packages:
- package: dbt-labs/dbt_utils
version: [">=1.0.0", "<2.0.0"]
Sonra:
dbt deps
dbt_utils paketi indirilir, dbt_packages/ klasörüne kurulur. Artık projende dbt_utils.surrogate_key, dbt_utils.date_spine, dbt_utils.pivot gibi makroları kullanabilirsin.
Örnek: surrogate_key
Birden fazla sütunu birleştirip benzersiz kimlik üretmek için:
SELECT
{{ dbt_utils.surrogate_key(['musteri_id', 'siparis_tarihi']) }} AS musteri_gun_id,
musteri_id,
SUM(toplam_tutar) AS gunluk_toplam
FROM {{ source('raw', 'siparisler') }}
GROUP BY 1, 2
surrogate_key arka planda md5(musteri_id || '-' || siparis_tarihi) üretir. Aynı müşteri + aynı gün hep aynı ID çıkar.
Örnek: pivot
Satır -> sütun dönüşümü için:
{{ dbt_utils.pivot(
'icecek_turu',
dbt_utils.get_column_values(table=ref('gunluk_siparis'), column='icecek_turu')
) }}
Bu, “her içecek türü kendi sütunu olsun” demek.
Başka Paketler
dbt_expectations: 50+ gelişmiş test (expect_column_values_to_be_between,expect_row_values_to_have_repeatsgibi).codegen: YAML şema dosyalarını otomatik üretir.audit_helper: İki modelin çıktısını karşılaştırır.dbt_project_evaluator: Projenin sağlığını denetler.
Ne Öğrendik?
- Macro = tekrar eden SQL parçasını bir kez yazıp yüz modelde çağırmak. Jinja dilinde yazılır.
- Package = başkalarının hazır macro’ları.
packages.yml’e ekle,dbt depsçalıştır. - En yaygın paket dbt_utils:
surrogate_key,pivot,date_spineve daha fazlası.
Küçük Ödev
macros/tarih_formatla.sqlmacro’sunu yaz ve bir modelde kullan.dbt_utils.surrogate_keyilemusteri_gun_idüreten bir model yaz.dbt deps+dbt runçalıştır, hatasız tamamlanmalı.
Sıradaki
Pencere fonksiyonları ve CTE: “her müşterinin en son siparişi”ni bul →