SQL Formatter

Notepad++ plugin

dbt & Jinja

dbt-Modelle sind kein reines SQL — sie stecken voller Jinja-Templating: {{ ref('orders') }}, {{ var('lookback_days') }}, {# erklärende Kommentare #} und {% if/for %}-Blöcke. Der Formatter erkennt diese Konstrukte als eigene Token-Kategorie und formatiert um sie herum, ohne jemals eine Klammer, ein Anführungszeichen oder ein Makro-Argument zu zerbrechen.

{{ ref(...) }} und {{ var(...) }} bleiben unverändert

Ein Modell, das über ref() oder source() auf andere Modelle verweist, oder eine konfigurierbare Variable über var(), wird wie ein gewöhnliches SELECT formatiert — der Jinja-Ausdruck selbst wird jedoch wörtlich übernommen, einschließlich des exakten Abstands innerhalb der doppelten geschweiften Klammern, den dbt selbst erwartet.

Vorher

select order_id, customer_id, amount from {{ ref('stg_orders') }} where amount > {{ var('min_amount') }}

Nachher

select order_id
     , customer_id
     , amount
  from {{ ref('stg_orders') }}
 where amount > {{ var('min_amount') }}

Kommentare, Kontrollfluss und ein Notausgang: @formatter:off

{# ... #} Jinja-Kommentare und {% ... %} Kontrollfluss-Tags ({% if %}, {% for %}, {% set %}) werden genau wie {{ ... }}-Ausdrücke erkannt und bleiben unverändert. Möchten Sie einen Block ganz vom Formatter ausnehmen — z. B. einen Makroaufruf mit ungewöhnlicher Formatierung, die Sie bewusst so gelassen haben — umschließen Sie ihn mit -- @formatter:off und -- @formatter:on.

Vorher

select
{{ ref('orders') }}.order_id
-- @formatter:off
from     weird_legacy_table   x
-- @formatter:on
{% if is_incremental() %}
where order_id > (select max(order_id) from {{ this }})
{% endif %}

Nachher

select {{ ref('orders') }}.order_id
-- @formatter:off
from     weird_legacy_table   x
-- @formatter:on
{% if is_incremental() %}
 where order_id > (select max(order_id) from {{ this }})
{% endif %}

Häufig gestellte Fragen

Funktioniert das auch mit verschachtelten Makros und mehreren ref()-Aufrufen in einer Zeile?

Ja — jeder {{ ... }}-Ausdruck wird einzeln erkannt, auch wenn mehrere in derselben SELECT-Zeile stehen oder ref()/var() in einen größeren Ausdruck eingebettet ist.

Muss ich etwas Besonderes einstellen, um dbt-Dateien zu erkennen?

Nein, die Jinja-Erkennung ist immer aktiv und funktioniert bei jeder Datei — es ist kein separater 'dbt-Modus'-Schalter nötig.