dbt Çekirdek Kurulumu: Proje Yapısı, Bağlantı Profilleri ve İlk SQL Dönüşümü
Komut satırından ilk dönüşüme: dbt Core'u profiles.yml ile yapılandırın BigQuery, Snowflake veya PostgreSQL, proje yapısını keşfedin (modeller, testler, tohumlar, makrolar) ve modeller arasında otomatik bağımlılıklar yaratan ref() makrosunu keşfedin.
Önkoşullar ve Kurulum
dbt Core, Python 3.8+ gerektirir ve pip aracılığıyla yüklenir. Önemli olan yüklemek yalnızca temel paket değil, aynı zamandaözel adaptör deponuz için. SQL lehçeleri farklı olduğundan her deponun kendi bağdaştırıcısı vardır.
# Installa dbt Core con l'adapter per PostgreSQL (ottimo per iniziare in locale)
pip install dbt-postgres
# Per BigQuery
pip install dbt-bigquery
# Per Snowflake
pip install dbt-snowflake
# Per DuckDB (ideale per sviluppo locale senza infrastruttura)
pip install dbt-duckdb
# Verifica l'installazione
dbt --version
# Core:
# - installed: 1.9.0
# - latest: 1.9.0 - Up to date!
Yerel Kalkınma için DuckDB'yi kullanmaya başlayın
BigQuery veya Snowflake'e anında erişiminiz yoksa DuckDB yol bu başlamak daha hızlıdır: doğrudan yerel olarak çalışan yerleşik bir veritabanıdır, Hiçbir altyapı gerektirmez ve dbt-duckdb her makinede çalışır. Öğrenmek için mükemmel masrafsız.
İlk dbt Projesini Oluşturun
komut dbt init Bir dbt projesinin klasör yapısını oluşturur ve size yol gösterir
ilk konfigürasyonda:
dbt init jaffle_shop
# dbt chiederà:
# 1. Quale database vuoi usare? (postgres/bigquery/snowflake/...)
# 2. [Per postgres] host, port, user, password, database, schema
# La struttura creata:
jaffle_shop/
├── dbt_project.yml # configurazione principale
├── README.md
├── analyses/ # query ad hoc (non materializzate)
├── macros/ # funzioni Jinja riutilizzabili
├── models/
│ └── example/ # modelli di esempio (da eliminare)
├── seeds/ # CSV statici
├── snapshots/ # snapshot per SCD
└── tests/ # test SQL singolari
dbt_project.yml dosyası
Proje konfigürasyonunun kalbi dbt_project.yml. Burayı tanımlayın
proje adı, dbt sürümü, dizin yolları ve genel yapılandırma
modellerden:
# dbt_project.yml
name: 'jaffle_shop'
version: '1.0.0'
# Versione minima di dbt richiesta
require-dbt-version: ">=1.8.0"
# Percorso del profile da usare (in profiles.yml)
profile: 'jaffle_shop'
# Directory dei modelli
model-paths: ["models"]
analysis-paths: ["analyses"]
test-paths: ["tests"]
seed-paths: ["seeds"]
macro-paths: ["macros"]
snapshot-paths: ["snapshots"]
# Dove salvare i log e i target compilati
target-path: "target"
log-path: "logs"
clean-targets: ["target", "dbt_packages"]
# Configurazione dei modelli per directory
models:
jaffle_shop:
# Tutti i modelli del progetto sono view per default
+materialized: view
staging:
# I modelli in staging/ sono sempre view
+materialized: view
+schema: staging # savedano in schema 'staging'
marts:
+materialized: table # I marts sono table per performance
+schema: marts
profiles.yml dosyası
Bağlantı kimlik bilgileri girer ~/.dbt/profiles.yml (ana dizinde,
Asla depoda). Her profilin birden fazla hedefi olabilir (geliştirme, aşamalandırma, üretim):
# ~/.dbt/profiles.yml
jaffle_shop:
target: dev # target di default
outputs:
dev:
type: postgres
host: localhost
port: 5432
user: "{{ env_var('DB_USER') }}" # usa variabili d'ambiente
password: "{{ env_var('DB_PASSWORD') }}"
dbname: jaffle_shop_dev
schema: dbt_dev_federico # schema personale per sviluppo
threads: 4
prod:
type: postgres
host: "{{ env_var('PROD_DB_HOST') }}"
port: 5432
user: "{{ env_var('PROD_DB_USER') }}"
password: "{{ env_var('PROD_DB_PASSWORD') }}"
dbname: jaffle_shop_prod
schema: dbt_prod
threads: 8
Kural, her geliştiricinin kişisel bir modele sahip olmasıdır (örn. dbt_dev_federico)
paralel geliştirme sırasında çatışmaları önlemek için.
dbt modelleri: Temel Birim
Bir dbt modeli bir dosyadır .sql rehberde models/. içerik
bu basit bir SELECT — dbt, depoda ilgili görünümü veya tabloyu oluşturmayla ilgilenir.
Gerçekçi bir örnekle başlayalım. Diyelim ki bir masamız var raw.orders içinde
uygulamadan alınan ham verileri içeren depo:
-- models/staging/stg_orders.sql
-- Staging model: rinomina, casta, pulisce — nessuna logica di business
WITH source AS (
SELECT * FROM {{ source('raw', 'orders') }} -- 'source' punta alla sorgente raw
),
renamed AS (
SELECT
id AS order_id,
user_id AS customer_id,
order_date AS created_at,
status,
CAST(amount AS DECIMAL(10,2)) AS total_amount,
LOWER(payment_method) AS payment_method,
_loaded_at AS loaded_at -- metadata pipeline
FROM source
WHERE id IS NOT NULL -- filtra record corrotti
)
SELECT * FROM renamed
ref() Makrosu
Makro ref() dbt'nin en önemli özelliğidir. Yazdığında
{{ ref('stg_orders') }}, veri tabanı:
- Geçerli ortam için depodaki tablonun/görünümün doğru adını çözer
- Bağımlılığı yönlendirilmiş döngüsel olmayan grafikte (DAG) kaydedin
- Bağımlı modelin ilk önce çalışmasını sağlar
-- models/marts/finance/orders_monthly.sql
-- Usa ref() per dipendere da stg_orders
WITH orders AS (
SELECT * FROM {{ ref('stg_orders') }} -- dbt risolve automaticamente lo schema
),
monthly_aggregated AS (
SELECT
DATE_TRUNC('month', created_at) AS month,
payment_method,
COUNT(*) AS order_count,
SUM(total_amount) AS gross_revenue,
AVG(total_amount) AS avg_order_value,
COUNT(DISTINCT customer_id) AS unique_customers
FROM orders
WHERE status = 'completed'
GROUP BY 1, 2
)
SELECT * FROM monthly_aggregated
Kaynak() Makrosu
Ham kaynaklara (dbt tarafından oluşturulmayan tablolar) erişmek için şunu kullanın: source() yerine
ref(). Kaynaklar bir dosyada bildirilmelidir sources.yml:
# models/staging/sources.yml
version: 2
sources:
- name: raw # nome del source group
database: raw_db # database nel warehouse
schema: public # schema nel warehouse
tables:
- name: orders
description: "Ordini grezzi dall'applicazione"
loaded_at_field: _loaded_at # campo per freshness check
freshness:
warn_after: {count: 12, period: hour}
error_after: {count: 24, period: hour}
- name: customers
description: "Clienti grezzi dall'applicazione"
Bu kurulumla çalıştırabilirsiniz dbt source freshness bunu doğrulamak için
Kaynaklar, dönüşümlere başlamadan önce güncellenir.
Dbt'yi çalıştırın: Temel Komutlar
# Esegui tutti i modelli (materialization nel warehouse)
dbt run
# Esegui solo i modelli staging
dbt run --select staging
# Esegui un singolo modello e tutte le sue dipendenze (+)
dbt run --select +orders_monthly
# Esegui tutti i test definiti nello schema YAML
dbt test
# Testa solo un modello specifico
dbt test --select stg_orders
# Compila i modelli senza eseguirli (utile per debug)
dbt compile
# Verifica freshness delle sorgenti
dbt source freshness
# Genera e serve la documentazione
dbt docs generate
dbt docs serve # apre http://localhost:8080
Önerilen Şablon Yapısı
dbt topluluğu tarafından önerilen üç katmanlı yapı:
models/
├── staging/ # Layer 1: vicino alla sorgente
│ ├── sources.yml # dichiarazione sorgenti
│ ├── schema.yml # test + documentazione
│ ├── stg_orders.sql
│ ├── stg_customers.sql
│ └── stg_products.sql
├── intermediate/ # Layer 2: join complessi (opzionale)
│ ├── int_orders_enriched.sql # join ordini + clienti
└── marts/ # Layer 3: pronti per consumo
├── finance/
│ ├── schema.yml
│ ├── orders_monthly.sql
│ └── revenue_by_country.sql
└── marketing/
└── customer_cohorts.sql
Anti-örüntü: Aşamalandırmada İş Mantığı
Hazırlama şablonlarının yalnızca "aptal" işlemler yapması gerekir: sütunları yeniden adlandırma, tür değiştirme türleri, tekilleştirme. İş mantığı (hesaplamalar, toplamalar, birleştirmeler) ara modellere gider veya martlar. Aşama modelinizde GROUP BY veya birkaçtan fazla hesaplanmış sütun varsa, muhtemelen bu katmanda çok fazla şey yapıyorsunuzdur.
Kurulumu dbt debug ile kontrol etme
Koşmadan önce dbt run, ambar bağlantısının çalıştığını doğrulayın:
dbt debug
# Output atteso:
# Configuration:
# profiles.yml file [OK found and valid]
# dbt_project.yml file [OK found and valid]
# Required dependencies:
# - git [OK found]
# Connection:
# host: localhost
# port: 5432
# user: federico
# database: jaffle_shop_dev
# schema: dbt_dev_federico
# [OK connection ok]
Sonuçlar ve Sonraki Adımlar
Üç seviyeli yapıya sahip çalışan bir dbt projesi yapılandırdık (aşama →
ara → martlar), farklı ortamlar için bağlantı profilleri, beyan edilen kaynaklar
tazelik kontrolü ve ilk modeller ref() e source().
Bir sonraki adım SQL'imizi Jinja ile dinamik hale getirmek: değişkenler, döngüler, koşullar ve depoda kod tekrarını ortadan kaldıran yeniden kullanılabilir makrolar.







