Lernpfad
In der Analytik-Technik bieten dbt-Makros (Data Build Tool) Makros eine super Möglichkeit, dynamische, wiederverwendbare SQL-Logik durch wiederverwendbare Code-Blöcke zu schreiben.
In diesem Tutorial schauen wir uns die Grundlagen von dbt-Makros an und wie man sie mit Jinja, bewährte Verfahren für die Wartbarkeit und praktische Anwendungen, alles mit Code-Beispielen.
Was sind dbt-Makros?
dbt-Makros sind wiederverwendbare Code-Blöcke, die mit der Jinja-Vorlagensprache innerhalb von dbt geschrieben werden. Damit kannst du generieren SQL zu erzeugen. Sie helfen dabei, Wiederholungen zu vermeiden und die Transformationslogik zu zentralisieren.
Diese Makros funktionieren genauso wie Funktionen in normalen Programmiersprachen.
Wenn du zum Beispiel eine bestimmte Kennzahl über mehrere Modelle hinweg berechnen musst, kann ein Makro diese Berechnung zusammenfassen, was die Pflege und Aktualisierung einfacher macht.
Makros können auch in Paketen gespeichert werden, wie zum Beispiel dbt-utils.
Warum dbt-Makros verwenden?
Makros haben ein paar Vorteile, vor allem:
- Redundanz reduzieren: Du kannst einen Logikblock einmal schreiben und dann überall wiederverwenden.
- Konsistenz: Die gleiche Transformationslogik auf alle Modelle anwenden, ohne dass du sie manuell duplizieren musst.
- Flexibilität: Makros können Parameter haben, sodass sie an verschiedene Eingaben angepasst werden können.
- Projektübergreifende Freigabe: Gut gemachte Makros kann man als Pakete teilen.
Diese Vorteile sorgen für sauberere, besser wartbare und skalierbare Codebasen.
Grundlegende Konzepte von dbt Macro
Um dir zu zeigen, wie Makros in dbt funktionieren, schauen wir uns ein paar wichtige Sachen an.
1. Wiederverwendbarkeit
Mit Makros kannst du einen Teil der SQL-Logik einmalig definieren und dann in mehreren Modellen, Tests oder sogar anderen Makros wiederverwenden.
2. Jinja-Template-Engine
Durch die Integration von Jinja mit dbt kannst du Variablen einfügen, Bedingungen anwenden und Listen durchlaufen, bevor dein SQL die Datenbank erreicht. dbt macht diese Vorlage zu rohem SQL, sodass Makros für jede Datenbank funktionieren.
3. Einführung in Programmiertechniken
Makros können SQL in ein programmierbares Framework verwandeln. Sie machen Logik, Schleifen und Bedingungen möglich – Sachen, die mit Standard-SQL nicht so flexibel zu handhaben sind.
Genau wie Funktionen können Makros in dbt Argumente (Parameter) nehmen und mit verschiedenen Eingaben aufgerufen werden, um unterschiedliche Ausgaben zu erzeugen. Sie machen komplexe Transformationen einfacher, indem sie sie in kleinere, wiederverwendbare Einheiten aufteilen.
Makros mit Jinja erstellen
Als Nächstes schauen wir uns an, wie wir ein paar Makros für uns selbst erstellen können.
Jinja ist die Template-Engine, die dbt-Makros unterstützt und es dir ermöglicht, SQL als dynamischen, programmierbaren Text zu behandeln.
Vorlagenkonstrukte und Begrenzer
Um Jinja zu nutzen, musst du bestimmte Vorlagenkonstrukte und Trennzeichen verwenden.
Hier sind ein paar gängige Konstrukte und Begrenzer:
- Ausdrücke
{{ }}: Fügt Ausdrücke ein. - Aussagen v
{% %}: Führt Anweisungen aus. - Kommentare zu „
{# #}“: Fügt Kommentare hinzu, die dbt ignorieren soll.
In Makros wird „ {{ ... }} “ für Ausdrücke verwendet, die einen Wert ausgeben sollen (z. B. Spaltennamen oder Berechnungen), während „ {% ... %} “ für die Steuerung des Ablaufs (Schleifen, if/else-Anweisungen, Makrodefinitionen) genutzt wird. Jinja-Kommentare benutzen {# ... #} und werden beim Kompilieren komplett rausgenommen.
Hier ist ein Beispiel für die Syntax, die für Anweisungen in Makros verwendet wird:
{% macro your_macro_name(your_variable) %}
select 'Hello, {{ your_variable}}' as greeting
{% endmacro %}
Hier ist ein Beispiel, wie du mit Anweisungen ein Makro erstellen kannst:
{% macro greet(name) %}
select 'Hello, {{ name }}' as greeting
{% endmacro %}
Um das Makro auszuführen, machst du Folgendes:
dbt run-operation greet(name) --args 'Austin'
Variablenverwaltung
Du kannst Variablen an Makros übergeben oder sie darin definieren. Filter wie upper oder lower können Textwerte umwandeln.
Hier ist eine Umsetzung der Funktion „ upper “, die alle Textwerte in Großbuchstaben umwandelt.
{% macro to_upper_case(column_name) %}
upper({{ column_name }})
{% endmacro %}
Um das zu machen, musst du das neu erstellte Makro in deinem dbt-Modell aufrufen/referenzieren.
Hier ist ein Beispiel für einen Code:
SELECT
id,
{{ to_upper_case('product_name') }} AS product_name_upper
FROM {{ source('public', 'orders') }}
Kontrollstrukturen
Ähnlich wie bei Programmiersprachen können dbt-Makros Folgendes bieten:
- Bedingte Anweisungen (
{% if %}/{% endif %}): - Loops (
{% for %}/{% endfor %})
Mit diesen Strukturen kannst du SQL-Klauseln dynamisch erstellen oder mehrere Ausdrücke basierend auf Eingaben generieren.
Das macht es für Makros einfacher, komplexe SQL-Generierungsaufgaben zu erledigen.
Parameterverwaltung und Fehlermanagement
Makros können Eingaben überprüfen und Fehler schon beim Kompilieren melden, um Probleme beim Ausführen zu vermeiden.
Parameter werden in der Makrodefinition mit runden Klammern ( () ) festgelegt, ähnlich wie bei Funktionsdefinitionen in Programmiersprachen.
Hier ist ein Beispiel, wie wir zwei Parameter einbauen können:
{% macro my_macro(param1, param2) %}
SELECT
{{ param1 }},
{{ param2 }}
FROM my_table
{% endmacro %}
Wie du siehst, haben wir in der ersten Zeile sowohl param1 als auch param2 angegeben.
Um das Makro in einem dbt-Modell zu verwenden, musst du doppelte geschweifte Klammern {{ }} benutzen. Die Parameter werden als Argumente in den Klammern übergeben.
SELECT
id,
{{ my_macro('column_a', 'column_b') }}
FROM my_source_table
In diesem Fall haben wir sowohl column_a als auch column_b als unsere Parameter angegeben.
Einrichtungsanleitung für die Arbeit mit dbt-Makros
Bevor wir mit dem Erstellen und Verwenden von Makros anfangen, richten wir erst mal eine Arbeitsumgebung ein, damit du die Beispiele in diesem Tutorial nachvollziehen kannst.
Damit stellst du sicher, dass du dbt installiert hast, einen Beispiel-Datensatz geladen hast und die richtige Ordnerstruktur zum Erstellen von Makros hast.
1. Installiere dbt Core
Du musst dbt Core lokal installiert haben. Wenn du in diesem Tutorial Postgres verwendest, installiere es mit diesem Befehl:
pip install dbt
Wenn dein Projekt ein Data Warehouse nutzt, mach stattdessen die entsprechenden Befehle:
pip install dbt-core dbt-postgres
pip install dbt-core dbt-snowflake
pip install dbt-core dbt-bigquery
2. Mach ein dbt-Projekt
Bevor wir irgendwelche dbt-Befehle ausführen, müssen wir eine Projektumgebung einrichten.
Geh zum Verzeichnis mit deinen gewünschten Projekten.
Hier speicherst du deine dbt-Projektdateien. In diesem Fall speichern wir alle zugehörigen Dateien in diesem dbt-Projektordner.
Um ein dbt-Projekt zu starten, musst du Folgendes ausführen:
dbt init
cd ~/dbt-macros-tutorial
Mach eine Ordnerstruktur in diesem Format:
macros_tutorial/
├─ models/
├─ macros/
├─ tests/
├─ seeds/
├─ dbt_project.yml
3. Bereite den Beispiel-Datensatz vor
Wir nutzen Python, um einen kleinen Datensatz mit Bestellungen zu erstellen, den wir dann in Postgres (oder dein ausgewähltes Warehouse) laden.
import pandas as pd
import random
from datetime import datetime, timedelta
from sqlalchemy import create_engine
# Create sample orders dataframe
random.seed(42)
num_rows = 20
start_date = datetime(2025, 1, 1)
data = []
for i in range(1, num_rows + 1):
order_date = start_date + timedelta(days=random.randint(0, 30))
ship_date = order_date + timedelta(days=random.randint(1, 10))
data.append({
'order_id': i,
'customer_id': random.randint(100, 105),
'order_date': order_date.date(),
'ship_date': ship_date.date(),
'status': random.choice(['pending', 'shipped', 'delivered']),
'revenue': round(random.uniform(50, 500), 2),
'cost': round(random.uniform(20, 400), 2)
})
df = pd.DataFrame(data)
# Load into Postgres
engine = create_engine('postgresql://user:password@localhost:5432/dbt_demo')
df.to_sql('orders', engine, if_exists='replace', index=False)
Anmerkung: Aktualisiere die Verbindungszeichenfolge für deine Datenbank.
4. Erstelle eine Quelle in dbt
Füge Folgendes zu „ models/src_orders.yml “ hinzu:
version: 2
sources:
- name: public
schema: public
tables:
- name: orders
5. Teste die Verbindung und die Quelle
dbt debug
dbt run-operation list_relations --args '{"schema_name": "public"}'
Jetzt kannst du Makros schreiben, die mit diesem Datensatz arbeiten.
Wie man dbt-Makros schreibt und benutzt
Jetzt probieren wir mal aus, ein paar eigene Makros zu schreiben.
Makros definieren
Speicher die Makrodefinitionen in .sql-Dateien im Verzeichnis macros/.
Wenn du Makros benennst, gib jedem Makro einen Namen, der sagt, wofür es gedacht ist, und mach es mit Parametern flexibel. Wenn du oben einen kurzen Docstring-Kommentar hinzufügst, können deine Teamkollegen besser verstehen, was du damit vorhast.
Hier ist ein Beispiel:
-- macros/my_macro.sql
{% macro cents_to_dollars(column_name, precision=2) %}
({{ column_name }} / 100.0)::numeric(18, {{ precision }})
{% endmacro %}
Makros in Modellen aufrufen
Du rufst Makros in Modellen mit {{ macro_name(arg1, arg2) }} auf. Du kannst sie in SELECT-Klauseln, WHERE-Filtern oder sogar ganzen CTE-Blöcken verwenden, sodass du wiederverwendbare SQL-Muster überall einfügen kannst.
Hier ein Beispiel:
-- models/my_model.sql
SELECT
order_id,
{{ cents_to_dollars('amount_in_cents') }} AS amount_in_dollars,
{{ cents_to_dollars('tax_in_cents', precision=4) }} AS tax_in_dollars
FROM {{ ref('raw_orders') }}
Aufrufen von Makros über die CLI
Für Aufgaben außerhalb der Modellentwicklung kannst du dieses Format/diese Syntax verwenden:
dbt run-operation macro_name --args '{"param": "value"}'
Damit kannst du SQL-Dienstprogramme wie Schemaerstellung oder Datenbereinigung ausführen, ohne ein Modell erstellen zu müssen.
Hier ist ein Beispiel für einen Befehl:
dbt run-operation greet --args '{"name": "Austin"}'
Makros aus Paketen verwenden
Makros können auch aus Paketen in dbt kommen, wie zum Beispiel dbt-utils.
Wenn du ein Paket über packages.yml installierst, sind seine Makros sofort verfügbar. Dazu musst du „ dbt deps “ ausführen.
Du kannst die neuen Makros dann mit diesem Format aufrufen: package_name.macro_name.
Organisation von Makrodateien
Sortiere und trenn Makros nach ihrer Funktion, damit sie besser organisiert und leichter zu pflegen sind.
Versuche, ähnliche Makros in separaten Dateien zu gruppieren (z. B. date_utils.sql, string_utils.sql), damit du sie leichter verwalten kannst. Das macht es einfacher, Logik im Laufe der Zeit zu finden und zu aktualisieren.
Beispiele für dbt-Makros in der Praxis
Hier sind ein paar Beispiele für Makros in praktischen Anwendungsfällen:
Makro zum Vergleich von Datumsangaben
Angenommen, du willst eine Funktion erstellen, die du oft zum Vergleichen von Datumsangaben nutzen wirst.
In diesem Fall kannst du ein Makro verwenden, um die Tagesunterschiede zwischen zwei Datumsfeldern zu berechnen und gleichzeitig SQL-Dialektunterschiede zu berücksichtigen.
Mach mal so: Erstell hier eine neue Datei: macros/date_utils.sql.
Dann nimmst du den folgenden Code:
{% macro days_between(start_col, end_col) %}
{#-- Handle different warehouses --#}
{% if target.type in ['postgres', 'redshift'] %}
(DATE_PART('day', {{ end_col }}::timestamp - {{ start_col }}::timestamp))
{% elif target.type in ['snowflake'] %}
DATEDIFF('day', {{ start_col }}, {{ end_col }})
{% elif target.type in ['bigquery'] %}
DATE_DIFF(CAST({{ end_col }} AS DATE), CAST({{ start_col }} AS DATE), DAY)
{% else %}
-- Fallback to ANSI-ish expression; may need adjustment per engine
CAST({{ end_col }} AS DATE) - CAST({{ start_col }} AS DATE)
{% endif %}
{% endmacro %}
Jetzt werden wir dieses neue Makro „ days_between “ in einem Modell verwenden.
with src as (
select * from {{ source('public', 'orders') }}
)
select
order_id,
customer_id,
order_date,
ship_date,
{{ days_between('order_date', 'ship_date') }} as days_to_ship
from src
Individuell angepasst generate_schema_name Makro
Standardmäßig nutzt dbt ein Standardmakro namens „ generate_schema_name “. Dieses Makro wird benutzt, um den Namen des Schemas anzugeben, in dem ein Modell erstellt werden soll.
Du kannst auch die Standardeinstellung von dbt überschreiben, um das pro Umgebung verwendete Schema zu steuern.
Du kannst diese Datei hier einfügen: macros/generate_schema_name.sql.
`sql
{% macro generate_schema_name(custom_schema_name, node) -%}
{# Policy:
- prod: ANALYTICS
- nonprod: dev_analytics, ci_analytics, etc.
#}
{%- if target.name == 'prod' -%}
{{ custom_schema_name | trim }}
{%- else -%}
{{ (target.name ~ '_' ~ custom_schema_name) | lower | replace(' ', '_') }}
{%- endif -%}
{%- endmacro %}
Wie es hilft: Bei „ dev “ landen die Modelle in der „ dev_analytics “-Umgebung (Isolation). Auf prod landen sie bei analytics. Das sorgt für planbare, reibungslose Bereitstellungen.
SQL außerhalb eines Modells ausführen
Du kannst SQL-Befehle auch außerhalb von Modellen ausführen, zum Beispiel für die Bereinigung von Tabellen oder Metadatenaktualisierungen, ohne Modelle erstellen zu müssen.
Du kannst ein Makro schreiben, das rohes SQL ausführt, und es dann über „ dbt run-operation “ starten.
Das ist praktisch für DDL (Tabellen löschen/erstellen) oder Metadaten-Updates, die nicht in ein Modell passen.
Hier ist das Makro:
{% macro cleanup_temp_tables() %}
{% set sql %}
drop table if exists {{ target.schema }}.temp_table;
delete from {{ target.schema }}.audit_log where event_type = 'test';
{% endset %}
{{ run_query(sql) }}
{% endmacro %}
Mach dann diesen Schritt im Terminal:
dbt run-operation cleanup_temp_tables
Damit kannst du Makros ausführen, ohne sie in Modelle einzubauen.
Beispiel für ein parametrisiertes Makro
Wir können auch ein Makro erstellen, das stark parametrisiert ist, wie bei einer Funktion.
In diesem Beispiel filtern wir Datensätze nach einem bestimmten Status, also wenn Werte angegeben sind. Hier werden die Anweisungen „ if “ und „ do “ benutzt, um Logik zu erstellen.
{% macro where_orders(status=None, min_date=None, max_date=None) %}
{%- set clauses = [] -%}
{%- if status is not none -%}
{%- do clauses.append("status = '" ~ status ~ "'") -%}
{%- endif -%}
{%- if min_date is not none -%}
{%- do clauses.append("order_date >= '" ~ min_date ~ "'") -%}
{%- endif -%}
{%- if max_date is not none -%}
{%- do clauses.append("order_date < '" ~ max_date ~ "'") -%}
{%- endif -%}
{%- if clauses | length > 0 -%}
where {{ clauses | join(' and ') }}
{%- endif -%}
{% endmacro %}
Jetzt packen wir dieses Makro in ein Modell rein:
with src as (
select * from {{ ref('orders') }}
)
select *
from src
{{ where_orders(status='shipped', min_date='2025-01-05') }}
Dieses Makro hat eine Logik eingebaut, die bei Auslassung eines Arguments greift; dieses Kriterium wird dann einfach ignoriert. So bleibt die optionale Logik übersichtlich.
Tipps für dbt-Makros
Beim Entwerfen cooler Makros geht's um mehr als nur darum, dass die SQL-Anweisung kompiliert werden kann. Die besten Makros sind leicht zu finden, gut dokumentiert, vorhersehbar, testbar und einfach zu entfernen oder zu erweitern.
Hier sind ein paar Tipps, die du beachten solltest:
1. Namenskonventionen und Parameterdesign
Genau wie bei SQL und Programmiersprachen muss man sich an Namenskonventionen halten, damit alles verständlich bleibt.
Hier sind ein paar Tipps zur Namensgebung:
- Sei klar und handlungsorientiert. Verwende lieber Verben oder klare Absichten (z. B. „
generate_select_list“ oder „where_orders“) statt vager Namen wie „helper“. - Halte die Namen stabil und in Kleinbuchstaben. Verwende snake_case und stabile Präfixe nach Domain, z. B.
date_*,string_*,test_*,admin_*.
2. Dokumentationsstrategien
Du solltest dir Gewohnheiten aneignen, die dir dabei helfen, deine Kreationen zu dokumentieren. Die Dokumentation sollte da gemacht werden, wo die Entwickler hinschauen.
Kombiniere zum Beispiel Inline-Docstrings + ein macros.yml (oder schema.yml) mit Beschreibungen und Beispielen.
Die Dokumentation kann Folgendes beinhalten:
- Zweck und erwartete Ergebnisse (1–2 Sätze)
- Parametertabelle mit Standardwerten und erlaubten Werten
- Kurzes Beispiel für die Verwendung in einem Modell und mit
run-operation - Hinweise zum Verhalten bei der Datenbankübergreifenden Nutzung
Beispiel für einen Ausschnitt aus einer Konfigurationsdatei:
version: 2
macros:
- name: days_between
description: |
Return day difference between two date expressions, normalized across warehouses.
arguments:
- name: start_col
type: string
description: Column/expression for the start date
- name: end_col
type: string
description: Column/expression for the end date
docs:
show: true
3. Code-Organisation
Dein Code muss auch gut organisiert sein, vor allem, wenn du viele Makros in deinem Verzeichnis verwalten musst.
Versuch, die Struktur nach Bereichen zu organisieren, damit es einfacher zu benutzen ist. Hier sind ein paar Beispiele dafür:
macros/date_utils.sqlmacros/string_utils.sqlmacros/testing/(benutzerdefinierte Tests)macros/admin/(DDL, Haushaltsführung)macros/compat/(Lagerunterlagen)
4. Halte Makros klein und auf einen Zweck beschränkt.
Ein Makro sollte eine Sache gut machen. Wenn du feststellst, dass ein Makro zu groß wird oder nicht dazugehörige Logik enthält, zerlege es in kleinere Makros. Das macht die Wiederverwendbarkeit besser und vereinfacht das Testen.
5. Makros mit typischen Daten testen
Benutze spezielle Testmodelle oder eine Staging-Umgebung, um das Verhalten von Makros zu überprüfen.
Zum Beispiel:
- Mach einen kleinen Startdatensatz, der auch die Randfälle abdeckt.
- Schreib ein Testmodell, das das Makro mit verschiedenen Parametern aufruft.
- Benutze „
dbt run“ und schau dir die kompilierte SQL an, um zu sehen, ob alles stimmt.
Profi-Tipp: Kombiniere Makros mit benutzerdefinierten Tests von „ dbt test “, um zu checken, ob die Ergebnisse den erwarteten Einschränkungen entsprechen.
Häufige Anwendungsfälle und Anwendungen
dbt-Makros sind echt vielseitig und man kann sie in vielen täglichen Workflows der Analytik-Entwicklung einsetzen.
Hier sind ein paar ausführliche Beispiele:
- Standardisierung von Datenumwandlungen: Makros können dafür sorgen, dass für mehrere Modelle die gleichen Namenskonventionen, Trimmvorgänge, Nullwertbehandlungen und Typumwandlungslogiken verwendet werden. Du kannst zum Beispiel ein Makro namens „
standardize_customer_name“ erstellen, um Namen in allen Marts gleich zu bereinigen und zu formatieren. - Unterstützung von datenbankübergreifenden Abfragen: Lager haben kleine Unterschiede in der SQL-Sprache. Makros können diese Unterschiede abstrahieren – zum Beispiel durch die Verwendung von „
DATEDIFF“ auf Snowflake und „DATE_DIFF“ auf BigQuery. Das macht deine Modelle tragbar. - Automatisierung von Qualitätsprüfungen: Schreib wiederverwendbare Makros, die Datentests machen, wie zum Beispiel die Suche nach doppelten IDs, kritischen Nullspalten oder Werten außerhalb des Bereichs. Die kann man in mehreren Testmodellen nutzen.
- Wiederholte SQL-Muster vereinfachen: Häufige CTEs, berechnete Felder oder Filterklauseln können in Makros parametrisiert werden. Zum Beispiel verhindert ein Makro zum Erstellen dynamischer „
WHERE“-Klauseln auf Basis optionaler Filter das Kopieren und Einfügen komplexer Logik.
Fortgeschrittene Techniken und Leistungsoptimierung
dbt-Makros können auch in fortgeschritteneren Anwendungen verwendet werden. Schauen wir uns mal zwei gängige Methoden an.
Rekursive und Metaprogrammiermuster
Makros können andere Makros aufrufen, Metadaten durchlaufen oder SQL-Fragmente basierend auf Schema-Inspektionen dynamisch generieren.
Damit kannst du:
- Mach automatisch Staging-Modelle für jede Tabelle.
- Erstell Pivot-/Unpivot-Abfragen, ohne jede Spalte einzeln eintippen zu müssen.
- Erstelle umgebungsbewusste Abfragen, indem du die Konfigurationsvariablen durchläufst.
Strategien zur Leistungsoptimierung
Du kannst auch noch ein paar Optimierungen machen, um die Leistung zu verbessern:
- Mach die Abfrage so einfach wie möglich, indem du nur die Spalten oder Verknüpfungen mitnimmst, die du wirklich brauchst.
- Passe Materialisierungen oder SQL-Strategien je nach Art des Data Warehouse an.
Integration mit dem dbt-Ökosystem
Makros sind als Teil des dbt-Ökosystems gedacht und werden noch mächtiger, wenn man sie mit Paketen, Cloud-Funktionen und externen Tools kombiniert.
Paketverwaltung
Viele Community-DBT-Pakete wie dbt-utils, dbt-date und dbt-expectations sind im Grunde Sammlungen von Makros, die man super wiederverwenden kann.
Diese Pakete bieten vorgefertigte Transformationen, Tests und Hilfsmittel, ohne das Rad neu zu erfinden.
Kompatibilität mit dbt Cloud und Entwicklertools
Makros funktionieren in dbt Cloud-Umgebungen total reibungslos, was bedeutet, dass deine dynamische SQL-Logik sich genauso verhält, egal ob sie lokal oder in einem geplanten Cloud-Job ausgeführt wird.
Sie lassen sich auch super mit Versionskontrolle, CI/CD-Pipelines und Code-Review-Prozessen verbinden, sodass Makro-Updates immer getestet und konsistent bereitgestellt werden.
Praktische Umsetzungsstrategien
Der Wechsel von normalen SQL-Skripten zu einem makrogesteuerten dbt-Workflow braucht sowohl technische Änderungen als auch eine kulturelle Umstellung.
Migration und Änderungsmanagement
Bei der Migration solltest du zuerst die sich wiederholenden SQL-Muster in den Modellen finden. Als Nächstes baust du diese schrittweise in Makros um und checkst, ob das kompilierte SQL mit der alten Logik übereinstimmt.
Nutze Feature-Flags (var()), um die neue Makro-Logik während der Einführung ein- und auszuschalten und so Störungen zu minimieren. Am wichtigsten ist, dass du deine Stakeholder über Änderungen auf dem Laufenden hältst, damit nachgelagerte Abfragen nicht kaputtgehen.
Governance und Einsatzstrategien
Für die Verwaltung solltest du zunächst klare Namenskonventionen, Parameterstandards und Dokumentationsanforderungen für alle Makros festlegen.
Als Nächstes überprüfst du Makroänderungen in Pull-Anfragen genauso wie Modellaktualisierungen und stellst sicher, dass sie den Leistungs- und Kompatibilitätsstandards entsprechen.
Schau dir in der Produktion die Jobprotokolle für makrogeneerte Abfragen an, um sicherzugehen, dass sie wie erwartet laufen. Für Projekte mit vielen Makros solltest du Dashboards einrichten, um die Kompilierungszeiten und die Abfrageleistung nach Makrotyp zu verfolgen.
Fazit
dbt-Makros sind echt wichtig für die Produktivität und Wartbarkeit in modernen Analytics-Engineering-Teams. Die Verwendung von dbt-Modellen zusammen mit Makros kann zu besseren Ergebnissen bei der Datenbereinigung führen.
Willst du mehr über DBT erfahren? Unsere Einführung in dbt und unser dbt-Tutorial könnten dir helfen.
Häufig gestellte Fragen zu dbt-Makros
Wie kann ich die Leistung meiner dbt-Makros verbessern?
Das Wichtigste ist, dass das SQL, das dein Makro erzeugt, effizient ist. Vermeide es, Schleifen zu benutzen, um SQL Zeile für Zeile zu erstellen. Versuch lieber, die Datenbank die Sachen mit setbasierten Abfragen regeln zu lassen. Außerdem solltest du Makros fokussiert halten und nicht zu viele Logikebenen hinzufügen, die zu kompliziertes SQL erzeugen. Wenn du feststellst, dass du dieselbe Berechnung immer wieder machst, solltest du sie im Makro zwischenspeichern oder in ein Modell verschieben.
Was sind einige häufige Fallstricke bei der Verwendung von dbt-Makros?
Ein häufiger Fehler ist, Makros so kompliziert zu machen, dass sie schwer zu verstehen oder zu debuggen sind. Ein weiterer Punkt ist, dass Unterschiede zwischen Datenbanken nicht berücksichtigt werden. Manchmal vergisst man vielleicht, Variablen zu maskieren, was zu Fehlern führen oder SQL-Code erzeugen kann, der für Teamkollegen unlesbar ist.
Wie kann ich Probleme mit dbt-Makros beheben?
Schau dir zuerst die kompilierte SQL im Ordner „target/compiled“ an. Diese Datei zeigt dir genau, was das Makro gemacht hat. Du kannst auch {{ log('message', info=True) }}-Anweisungen in dein Makro einfügen, um zu sehen, was während der Laufzeit passiert. Wenn was kaputt geht, mach die Eingaben einfacher und probier's mit kleineren Beispielen mit dbt run-operation, bis du das Problem findest.
Kann man dbt-Makros mit anderen Tools oder Frameworks zusammen nutzen?
Ja, aber nur über dbt selbst. Zum Beispiel können Tools wie Airflow oder Dagster dbt-Befehle ausführen, die deine Makros aufrufen. In dbt können Makros auch über Pakete wie dbt-utils geteilt werden. Du kannst ein dbt-Makro aber nicht direkt in einem anderen Tool ausführen, es sei denn, du packst es in einen dbt-Befehl.
Was sind die besten Methoden, um dbt-Makros zu dokumentieren?
Ein paar gute Tipps sind, Makros wie kleine Funktionen zu sehen, die andere Leute benutzen werden. Schreib auch klare Beschreibungen ihrer Funktionen, liste alle Argumente auf (wenn möglich mit Standardwerten) und zeig kurze Beispiele für ihre Verwendung. Wenn sich das Makro in verschiedenen Datenbanken anders verhält, schreib das auch auf. Gute Dokumentation macht es deinen Teamkollegen einfacher, deiner Arbeit zu vertrauen und sie wiederzuverwenden.

Ich bin Austin, ein Blogger und Tech-Autor mit jahrelanger Erfahrung als Datenwissenschaftler und Datenanalyst im Gesundheitswesen. Ich habe meine Reise in die Welt der Technik mit einem Hintergrund in Biologie begonnen und helfe jetzt anderen mit meinem Technik-Blog, den gleichen Weg einzuschlagen. Meine Leidenschaft für Technologie hat dazu geführt, dass ich für Dutzende von SaaS-Unternehmen schreibe, um andere zu inspirieren und meine Erfahrungen zu teilen.

