Cuando los proyectos en dbt Labs crecen, el código SQL empieza a repetirse:
- Lógica de limpieza similar en múltiples modelos
- Cálculos estándar replicados
- Condiciones repetidas
- Transformaciones compartidas
Duplicar código no es escalable ni mantenible.
Aquí es donde entran las macros en dbt.
¿Qué es una macro en dbt?
Una macro en dbt es una función escrita en Jinja que permite:
- Reutilizar fragmentos de SQL
- Parametrizar lógica
- Reducir duplicación
- Centralizar transformaciones
Las macros se definen en archivos dentro de la carpeta /macros del proyecto.
Sintaxis básica
Ejemplo simple de macro:
{% macro calculate_margin(revenue, cost) %}
({{ revenue }} – {{ cost }})
{% endmacro %}
Uso dentro de un modelo:
SELECT
order_id,
{{ calculate_margin(‘total_revenue’, ‘total_cost’) }} AS margin
FROM orders;
La macro genera el SQL dinámicamente.
Jinja: el motor detrás de las macros
dbt utiliza Jinja como motor de plantillas.
Esto permite:
- Variables
- Condicionales
- Bucles
- Lógica dinámica
Ejemplo con condicional:
{% macro filter_active(column_name) %}
{% if target.name == ‘prod’ %}
{{ column_name }} = ‘active’
{% else %}
1 = 1
{% endif %}
{% endmacro %}
Esto permite comportamientos distintos según entorno.
Casos de uso comunes
Las macros son especialmente útiles para:
- Cálculos estándar compartidos
- Lógica de auditoría
- Generación dinámica de columnas
- Transformaciones condicionales
- Modelos multi-entorno
Reducen repetición y centralizan cambios.
Ejemplo avanzado: generar columnas dinámicamente
{% macro sum_columns(column_list) %}
{% for col in column_list %}
SUM({{ col }}) AS sum_{{ col }}{% if not loop.last %},{% endif %}
{% endfor %}
{% endmacro %}
Uso:
SELECT
{{ sum_columns([‘revenue’, ‘cost’, ‘tax’]) }}
FROM transactions;
Esto genera automáticamente múltiples agregaciones.
Macros y buenas prácticas
Para mantener calidad en proyectos grandes:
- Documentar macros
- Nombrarlas claramente
- Evitar lógica excesivamente compleja
- Mantenerlas modulares
- Versionarlas adecuadamente
Las macros deben simplificar, no complicar.
Macros y paquetes externos
dbt permite utilizar paquetes externos que incluyen macros predefinidas.
Por ejemplo:
- dbt-utils
- dbt-expectations
Estos paquetes aportan funciones listas para usar y aceleran desarrollo.
Diferencia entre macro y modelo
Un modelo:
- Genera una tabla o vista
Una macro:
- Genera SQL reutilizable
La macro no crea objetos directamente, sino que produce código que otros modelos ejecutan.
Errores comunes
- Abusar de macros para lógica innecesaria
- Introducir demasiada lógica de negocio dentro de Jinja
- No documentar parámetros
- Hacer macros difíciles de leer
- Mezclar demasiada lógica procedural
Las macros deben mantener claridad.
Macros y mantenimiento a largo plazo
Uno de los mayores beneficios es el mantenimiento centralizado.
Si una fórmula cambia:
- Se actualiza la macro
- Todos los modelos que la usan se benefician
- No es necesario modificar múltiples archivos
Esto reduce deuda técnica.
Integración con plataformas cloud
En arquitecturas donde dbt transforma datos en plataformas como Snowflake, las macros permiten:
- Estandarizar lógica de negocio
- Mantener coherencia de métricas
- Reducir duplicación
- Escalar proyectos grandes
Se convierten en una pieza clave en proyectos enterprise.
Conclusión
Las macros en dbt permiten llevar los proyectos de transformación de datos a un nivel superior. Al encapsular lógica reutilizable y parametrizable, reducen duplicación, mejoran mantenibilidad y facilitan escalabilidad.
Utilizadas correctamente, las macros convierten proyectos dbt en estructuras más limpias, organizadas y profesionales.
En equipos que trabajan con modelado analítico avanzado, dominar macros no es opcional: es una habilidad esencial.




