Make SQL Great Again! dbt 為沉悶的 SQL 資料轉換注入新活力
- Chen Max
- 2024年8月7日
- 讀畢需時 3 分鐘
已更新:2024年9月5日

在現代資料棧 ( MDS ) 裡的轉換層 ( transformation layer ) 主⾓其實是 SQL ,⽽ dbt ( Data Build Tool ) 則是擔任輔助⽣成 SQL 的⾓⾊。dbt 加 SQL 的組合可以完成之前許多困難的事情。
這裏分成幾個方向介紹 dbt + SQL 可以完成的事。例如: 組合 SQL、動態生成 SQL、輔助程式語言、版本控制。
組合 SQL
SQL 有提供視圖 ( view ) 的機制:「 我們可以把任意的 SQL 查詢 (query),變成一個對應的視圖 ( view ) ,並且為其命名」。從這個角度來看, SQL view 本身就是一種模組化與抽象化機制。
模組化機制:把某個查詢變成視圖,其它的查詢⼜可以利⽤這個視圖的結果。
抽象化機制:可以對視圖加以命名。
綜合上述, SQL 的 view 機制,就已足以讓我們靈活地組合小的查詢而生成複雜的資料轉換,同時,我們所需要的資料建模 ( data modeling ) ,恰好可以由大量的視圖 ( view ) 來構成
動態⽣成 SQL
常常遇見 SQL 結構類似 ,只是些許內容不同,每當要增加新的資料表、條件 ... ,就要修改許多程式段落。
例如:該公司的用戶只有 A , B , C 三個用戶,同時訂單表的欄位只有 w , x ,
y , z,SQL 的內容如下
SELECT w, x, y, z, "A" AS user_name FROM A.invoices
UNION ALL
SELECT w, x, y, z, "B" AS user_name FROM B.invoices
UNION ALL
SELECT w, x, y, z, "C" AS user_name FROM C.invoices
若用戶的數量有變動時,就要不斷的修改 SQL。
若透過 jinja 樣板語言 (template language) 動態生成相同的 SQL,就可以免除不斷大幅修改。
{% set users = ["A", "B", "C"] %}
{% for user in users %}
SELECT w, x, y, z, '{{user}}' AS user_name
FROM A.invoices
{{ "UNION ALL" if not loop.last }}
{% endfor %}
如果⽇後⽤⼾的數⽬改變,只需要改變 {% set users = ... } 這⼀⾏即可以。
輔助程式語言
動態生成 SQL 可以選擇各式各樣的程式語言來做這件事,然而,該用什麼樣子的語言來輔
助動態生成 SQL 最合理呢 ?自家公司最主要的通用型程式語言嗎?還有更好的選項嗎 ?
如果選擇像 jinja 這樣子的樣板語言 ( template langauge ) 而非通用型程式語言 ( general
purpopse language ) 的話,可以有下列的優點:
樣板語言的語法相對少,因為只適合處理樣板類的應用情境。
語法相對少、所以也相對容易學習。
專案會變得對通用型程式語言 ( GPL ) 顯得語言無關 ( language agnostic )
負責維護此資料建模專案的人,進入門檻會比較低。
版本控管
如果要有系統地透過 SQL 來做出資料建模,需要做下列的事:
準備一個資料建模資料夾,裡頭放的檔案都是一個又一個的 ${model_name}.sql 檔。而檔案的內容,每個都是一個 SQL 查詢,它會生成對應的 SQL 視圖。
準備一個組態設置檔 ( config.yaml ),裡頭放一些參數,這些參數可能是用來指定資 料倉儲的連線方式,包含使用者名稱、密碼、主機名稱等。
準備一隻程式,它會結合「組態設置檔」與「資料建模資料夾」內的檔案,透過執行 jinja 語法,來產生確實可以直接對資料倉儲執行的 SQL 檔。
把步驟 3 產生的 SQL 檔,照著它們彼此相依 (dependency) 的順序,去對資料倉儲執 行。
所以要對專案做版本控管的話,只需要把前述的「資料建模資料夾」、「組態設置
檔」納入版本控管即可。
總結
綜合所述,結合 SQL 與 dbt 不僅能靈活地模組化與抽象化資料查詢,還能利用動態生成技術簡化資料處理。通過樣板語言 jinja,可以降低學習曲線及難度。搭配版本控制,能更有效管理與追蹤資料建模變更。
作者簡介
陳家宏 (Laurence Chen),從事十年以上的軟體開發,現職 IT 顧問,同時也是 Clojure 社群、dbt Taipei 社群的線下活動主辦人之一。
主要協助企業導入現代資料棧 (modern data stack)、改善資料處理、軟體開發、應用資料分析。著有《從錯誤到創新:跨領域的錯誤處理、創新之道》。
留言