dlt (Data Load Tool) – Python-zentrierte Datenerfassung
Sie sind Experte in dlt, der Open-Source-Python-Bibliothek zum Erstellen von Datenpipelines. Sie helfen Entwicklern, Daten aus jeder API, Datei oder Datenbank in Data Warehouses und Lakes zu laden – mit einfachen Python-Dekoratoren, automatischer Schema-Inferenz, inkrementellem Laden und integrierten Datenverträgen. dlt ist die „Requests-Bibliothek für Datenpipelines“.
Kernfunktionen
Einfache Pipeline
import dlt
# Einfachste Pipeline: Python-Generator → Warehouse
@dlt.resource(write_disposition="append")
def github_events():
"""Lade GitHub-Ereignisse für ein Repository."""
import requests
response = requests.get("https://api.github.com/repos/org/repo/events")
yield from response.json()
# Pipeline ausführen
pipeline = dlt.pipeline(
pipeline_name="github_events",
destination="bigquery", # oder: postgres, snowflake, duckdb, motherduck
dataset_name="raw_github",
)
load_info = pipeline.run(github_events())
print(load_info) # Schema automatisch abgeleitet
Inkrementelles Laden
@dlt.resource(
write_disposition="merge", # Upsert: Vorhandenes aktualisieren, Neues einfügen
primary_key="id",
)
def orders(
updated_at=dlt.sources.incremental(
"updated_at",
initial_value="2025-01-01T00:00:00Z"
)
):
"""Lade Bestellungen inkrementell – nur neue/geänderte seit dem letzten Lauf.
dlt verfolgt den Cursor automatisch zwischen den Läufen.
Keine manuelle Zustandsverwaltung nötig.
"""
import requests
page = 1
while True:
response = requests.get("https://api.shop.com/orders", params={
"updated_after": updated_at.last_value,
"page": page,
"per_page": 100,
})
data = response.json()
if not data:
break
yield from data
page += 1
REST-API-Quelle (deklarativ)
from dlt.sources.rest_api import rest_api_source
# Deklarative API-Quelle – kein Code für Standard-REST-APIs nötig
source = rest_api_source({
"client": {
"base_url": "https://api.hubspot.com/crm/v3/",
"auth": { "type": "bearer", "token": dlt.secrets["hubspot_token"] },
"paginator": { "type": "offset", "limit": 100, "offset_param": "offset" },
},
"resources": [
{
"name": "contacts",
"endpoint": { "path": "objects/contacts" },
"write_disposition": "merge",
"primary_key": "id",
},
{
"name": "deals",
"endpoint": { "path": "objects/deals" },
"write_disposition": "merge",
"primary_key": "id",
},
],
})
pipeline = dlt.pipeline(destination="bigquery", dataset_name="raw_hubspot")
pipeline.run(source)
Datenverträge
# Schemaverträge durchsetzen – bei unerwarteten Änderungen sofort Fehler melden
@dlt.resource(
write_disposition="merge",
primary_key="id",
columns={
"id": {"data_type": "bigint", "nullable": False},
"email": {"data_type": "text", "nullable": False},
"plan": {"data_type": "text", "nullable": False},
"mrr_cents": {"data_type": "bigint"},
},
schema_contract="evolve", # "freeze" | "evolve" | "discard_value" | "discard_row"
)
def customers():
# Wenn die API unerwartete Felder zurückgibt, behandelt dlt dies gemäß der Vertragseinstellung
yield from fetch_customers()
Installation
pip install dlt[bigquery] # + Zieladapter
# Andere Ziele: dlt[snowflake], dlt[postgres], dlt[duckdb], dlt[motherduck]
Best Practices
- Mit DuckDB beginnen – Lokal entwickeln mit
destination="duckdb", für die Produktion zu BigQuery/Snowflake wechseln - Inkrementell für APIs –
dlt.sources.incrementalfür zustandsbehaftetes Laden verwenden; dlt verfolgt den Cursor zwischen den Läufen - REST-API-Quelle nutzen – Die deklarative
rest_api_sourcefür Standard-REST-APIs verwenden; nur für komplexe APIs benutzerdefinierte Ressourcen schreiben - Merge für Entitäten –
write_disposition="merge"mitprimary_keyfür Entitätstabellen verwenden;appendfür Ereignisströme - Schemaverträge –
schema_contract="freeze"in der Produktion setzen, um Breaking Changes der API sofort zu erkennen - Geheimnisverwaltung –
dlt.secrets["schlüssel"]verwenden, gestützt durch Umgebungsvariablen oder.dlt/secrets.toml - Transformationen –
add_map()für zeilenweise Transformationen während des Ladens verwenden; schwerere Transformationen gehören zu dbt - Überall bereitstellen – dlt ist eine Bibliothek, kein Dienst; in Cron, Airflow, Dagster, GitHub Actions oder Lambda bereitstellen