在 dbt 中認識 Jinja

案例研習:使用 dbt 建立電商資料模型

Susan Sun

Freelance Data Scientist

dbt 使用三種語言

dbt 使用「三種」語言:

  • SQL:用於轉換
  • YAML:用於文件與測試
  • Jinja:用於樣板
  • SQL 範例:

    SELECT * FROM ...
    
  • YAML 範例:

    - name: customers
      description: A data mart
    
  • Jinja 範例:

    FROM {{ ref('stg_looker__users') }}
    
案例研習:使用 dbt 建立電商資料模型

什麼是 dbt Jinja

什麼是 dbt Jinja?

  • 類 Python 的樣板語言
  • 用來產生動態 SQL
  • 用於 dbt 模型、巨集、測試等

為什麼實用?

  • 協作更順暢
  • 減少重複(DRY),程式碼可重用

dbt 中 Jinja 範例

  • 參照 dbt 模型

    SELECT *
    FROM {{ ref('stg_looker__users') }}
    
  • 建立迴圈

    {% for column in ['col1', 'col2'] %}
      SELECT {{ column }}
      FROM table_name
    {% endfor %}
    
案例研習:使用 dbt 建立電商資料模型

dbt Jinja 的型態

  1. Jinja「敘述」用 {%...%} 包起來
     {% set order_statuses = ['Shipped', 'Complete', 'Processing'] %}
    
  2. Jinja「運算式」用 {{...}} 包起來
     SELECT * FROM {{ ref('stg_looker__users') }}
    
  3. Jinja「註解」用 {# #} 包起來
     {# This is a comment #}
    
案例研習:使用 dbt 建立電商資料模型

Jinja 敘述:set

  • Jinja 敘述類型:setloopconditional(if/else)、macros

  • set 敘述會建立變數並指定值。

    • 樣板:
      {% set ... %}
      
    • 範例:
      {% set country = 'Australia' %}
      
案例研習:使用 dbt 建立電商資料模型

Jinja 與 dbt 編譯(compile)

用法

  • customers.sql 中,如下:
{% set country = 'Australia' %}

SELECT ...
FROM ...
WHERE country = '{{ country }}'

編譯後的程式碼

  • dbt compile -s customers.sql 輸出:


SELECT ...
FROM ...
WHERE country = 'Australia'

案例研習:使用 dbt 建立電商資料模型

Jinja 與 dbt 編譯(compile)

  • 單一模型的終端機輸出
  • dbt compile -s customers.sql 輸出:
Running with dbt=1.8.4
...
Compiled node 'customers' is:
WITH customer_base AS (
    SELECT 
...
    FROM "dbt"."main"."stg_looker__users"
    WHERE country = 'Australia'
)
...
  • 產生 /target/compiled 目錄
  • dbt compile 會產生編譯後檔案:

dbt compile 子指令自動產生的一系列資料夾截圖。最上層是 looker ecommerce dbt 專案。第二層為 `target`,第三層為 `compiled`。在 `compiled` 之下,有一系列模仿 dbt 專案結構的目錄,裡面放著模型與測試的編譯查詢。

案例研習:使用 dbt 建立電商資料模型

一起來練習吧!

案例研習:使用 dbt 建立電商資料模型

Preparing Video For Download...