dbt con Python
dbt gestiona las transformaciones del almacén de datos como modelos versionados, principalmente en SQL, con modelos de Python donde los adaptadores permiten lógica estilo pandas/polars en el tiempo de ejecución del almacén.
Busca en todas las páginas de la documentación
dbt gestiona las transformaciones del almacén de datos como modelos versionados, principalmente en SQL, con modelos de Python donde los adaptadores permiten lógica estilo pandas/polars en el tiempo de ejecución del almacén.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
# models/staging/stg_orders.sql
select
order_id,
cast(revenue as double) as revenue,
region,
ordered_at
from {{ source('raw', 'orders') }}
where order_id is not null# models/marts/revenue_by_region.py (modelo Python de dbt)
def model(dbt, session):
df = dbt.ref("stg_orders").to_pandas()
return df.groupby("region", observed=True)["revenue"].sum().reset_index()Cuándo usar esto:
dbt build en cada PR-- models/staging/stg_orders.sql
with source as (
select * from {{ source('ecommerce', 'orders') }}
),
cleaned as (
select
order_id,
upper(trim(region)) as region,
cast(revenue as numeric(18, 2)) as revenue,
ordered_at::timestamp_tz as ordered_at
from source
where revenue >= 0
)
select * from cleaned# models/staging/schema.yml
models:
- name: stg_orders
columns:
- name: order_id
tests: [unique, not_null]
- name: revenue
tests:
- not_null
- dbt_expectations.expect_column_values_to_be_between:
min_value: 0-- models/marts/fct_revenue_daily.sql
select
date_trunc('day', ordered_at) as revenue_date,
region,
sum(revenue) as total_revenue,
count(*) as order_count
from {{ ref('stg_orders') }}
group by 1, 2Lo que esto demuestra:
source y refview, table, incremental).ref() - dbt build ejecuta pruebas después de construir modelos.manifest.json, catalog.json para herramientas de linaje.| Capa | Rol |
|---|---|
| staging | Renombrar, castear, limpieza ligera |
| intermediate | Uniones de negocio |
| marts | Hechos/dimensiones orientados al consumidor |
# Mantén los modelos de Python delgados - la mayor parte del trabajo pesado todavía pertenece a SQL cuando es posible
def model(dbt, session):
import pandas as pd
orders = dbt.ref("stg_orders")
pdf = orders.to_pandas() if hasattr(orders, "to_pandas") else orders
# ingeniería de características...
return pdfunique/not_null como mínimo en las claves primarias.incremental_strategy y claves únicas.target de desarrollo/producción a través de variables de entorno.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Stored procs SQL puras | Equipo de operaciones nativo del almacén | Quieres flujo de trabajo de PR de git y pruebas |
| Scripts de pandas | Transformaciones a escala de portátil | El almacén de datos es la fuente de verdad |
| Spark/dbt-spark | Transformaciones de clústeres enormes | Los marts SQL son suficientes |
| SQLMesh | Necesitas entornos virtuales por rama | El equipo ya usa dbt Cloud |
dbt debug && dbt build --select stg_orders+is_incremental() en el modelo.description de schema.yml se reflejan en el sitio de documentación de dbt.tests:
- relationships:
to: ref('dim_customers')
field: customer_iduv.pii en metadatos YAML.models/ vive junto a la aplicación - trabajo de CI separado para dbt build.Versiones de Stack: Esta página fue escrita para Python 3.14.0 (estable 3.14, mantenimiento 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, y uv 0.6+.
Revisado por Chris St. John·Última actualización: 16 jul 2026