iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
DevOps

我獨自升級:從水管工走向 DataOps系列 第 23

【Day 23】Data Pipeline 測試 - SQL linter feat. SQLFluff

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20241007/20135427R3hXdV5yUD.png

基本介紹

SQLFluff 是一個開源的 SQL 語法檢查和格式化工具(Linter),主要是確保 SQL 語法遵循特定樣式規範,團隊開發過程中才能保有內部的一致性,除了開發維護上可以更快速,也能避免語法錯誤。

dbt 官方建議也是建議使用 SQLFluff 來檢查樣式

使用 SQLFluff linter 的好處

  • 一致性:SQLFluff 在 dbt 專案中確保程式碼風格的一致性,例如關鍵字大小寫、逗號位置、縮排方式、別名規則等方面的統一。
  • 可讀性:經過良好格式化的整潔程式碼更容易閱讀和理解。
  • 可維護性:遵循一致的格式和編碼規範使得 SQL 模型更易於維護。當需要修改或排除問題時,標準化的程式碼庫能簡化這一過程,並降低引入錯誤的可能性。
  • 自動化檢查:SQLFluff 可以無縫整合到 dbt 專案的開發流程中,能在 SQL model 提交前自動檢測潜在問題。

SQLFluff 實作

clone 專案

$ git clone https://github.com/snhou/astronomer-cosmos-poc.git
$ cd /astronomer-cosmos-poc

中間可以開虛擬環境和執行 docker 容器,可以參考 【Day 17】用 Astronomer Cosmos 結合 dbt 和 Airflow - 再戰 Jaffle Shop

安裝 sqlfluff 和 dbt 模組

$ pip install sqlfluff sqlfluff-templater-dbt

確認版本

$ sqlfluff version

自訂 SQL 格式:.sqlfluff

可以先參考官方提供的範例來修改,下方只有留一些當作範例。

[sqlfluff]
dialect = postgres
templater = dbt  # 使用 dbt 作為模板
max_line_length = 80  # 每行最大字符數限制為 80
indent_unit = space  # 使用空格作為縮排單位

[sqlfluff:indentation]
tab_space_size = 4  # 設定縮排為 4 個空格

[sqlfluff:layout:type:comma]
spacing_before = touch  # 逗號前不留空格
line_position = trailing  # 逗號放在行尾

[sqlfluff:rules:capitalisation.keywords] 
capitalisation_policy = upper  # 關鍵字使用大寫

[sqlfluff:rules:aliasing.column]
aliasing = explicit  # 明確欄位別名

實際使用的時候記得刪除註解喔~/images/emoticon/emoticon15.gif

全部有哪些規則可以設定,可以參考官方文件的規則說明

檢查 sql 格式

$ cd /dbt/jaffle_shop
$ sqlfluff lint models/staging/stg_payments.sql

https://ithelp.ithome.com.tw/upload/images/20241007/201354277gzBk3uPgp.png

這裡可以看到基本上都是提到大小寫的問題, sql 大小寫都可以,這裡只是示範設定和 lint 而已~

修復 sql 格式

$ sqlfluff fix models/staging/stg_payments.sql

https://ithelp.ithome.com.tw/upload/images/20241007/20135427ASyjiwJY3f.png

執行完就可以看到 FIXED 的字樣了

.sqlfluffignore

就像是 .gitignore 一樣,可以設定執行過程中,什麼檔案和資料夾內不要執行

temp/
testing.sql

SQLFluff in VSCode

在 vscode 當中要自動偵測的話,記得要來設定這邊新增執行路徑
https://ithelp.ithome.com.tw/upload/images/20241007/20135427mlkpyc5mea.png

也可以直接從 setting.json 設定或是直接裝別人的設定

SQLFluff


上一篇
【Day 22】Data Pipeline CI / CD - AWS CodePipeline
下一篇
【Day 24】Data Pipeline 測試 - Python linter feat. Ruff
系列文
我獨自升級:從水管工走向 DataOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言