Direkt zum Inhalt

dbt-Makros: Ein umfassender Leitfaden

Lerne, was dbt-Makros sind, was sie machen und wie man sie in dbt-Modellen definiert und aufruft.
Aktualisierte 22. Sept. 2025  · 11 Min. Lesezeit

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.sql
  • macros/string_utils.sql
  • macros/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(&apos;message&apos;, 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.


Austin Chia's photo
Author
Austin Chia
LinkedIn

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.

Themen

Die besten DataCamp-Kurse

Lernpfad

dbt Grundlagen

0 Min.
Baue zuverlässige, skalierbare Datenpipelines mit dbt Fundamentals, einem praxisorientierten Lernpfad für Datenanalysten, Dateningenieure und Analytiker.
Siehe DetailsRight Arrow
Kurs starten
Mehr anzeigenRight Arrow
Verwandt

Lernprogramm

Ein Leitfaden zu Python-Hashmaps

Finde heraus, was Hashmaps sind und wie sie in Python mit Hilfe von Wörterbüchern umgesetzt werden.
Javier Canales Luna's photo

Javier Canales Luna

Lernprogramm

Python-Lambda-Funktionen: Ein Leitfaden für Anfänger

Lerne mehr über Python-Lambda-Funktionen, wozu sie gut sind und wann man sie benutzt. Enthält praktische Beispiele und bewährte Methoden für eine effektive Umsetzung.
Mark Pedigo's photo

Mark Pedigo

Lernprogramm

Fibonacci-Folge in Python: Lerne und entdecke Programmiertechniken

Finde raus, wie die Fibonacci-Folge funktioniert. Schau dir die mathematischen Eigenschaften und die Anwendungen in der echten Welt an.
Laiba Siddiqui's photo

Laiba Siddiqui

Lernprogramm

Python-Tutorial zum Verknüpfen von Zeichenfolgen

Lerne verschiedene Methoden zum Verknüpfen von Zeichenfolgen in Python kennen, mit Beispielen, die jede Technik zeigen.
DataCamp Team's photo

DataCamp Team

Lernprogramm

Abstrakte Klassen in Python: Ein umfassender Leitfaden mit Beispielen

Lerne mehr über abstrakte Klassen in Python, wozu sie gut sind und wie du mit dem Modul „abc“ einheitliche Schnittstellen sicherstellen kannst. Enthält praktische Beispiele und bewährte Methoden für eine effektive Umsetzung.
Derrick Mwiti's photo

Derrick Mwiti

Lernprogramm

Python-Schleifen-Tutorial

Ein umfassendes Einführungs-Tutorial zu Python-Schleifen. Lerne und übe while- und for-Schleifen, verschachtelte Schleifen, die Schlüsselwörter break und continue, die Range-Funktion und vieles mehr!
Satyabrata Pal's photo

Satyabrata Pal

Mehr anzeigenMehr anzeigen