iT邦幫忙

2024 iThome 鐵人賽

DAY 24
1
AI/ ML & Data

dbt 修煉之路系列 第 24

dbt 自動化檢查 - Git Diff Operator

  • 分享至 

  • xImage
  •  

為什麼需要 Git Diff Operator?

在前一篇文章中,我們介紹了 dbt_operator 及其檢索異動 models 的功能。有讀者可能會問:「git_diff_operator 的功能是提取變更的檔案列表,這不是和 dbt_operator 功能重複了嗎?」

實際上,git_diff_operator 能解決 dbt_operator 的兩個重要限制:

  1. 重命名識別問題:當開發者重命名 model 時,dbt 會將其視為「刪除舊 model」和「創建新 model」兩個操作。然而在實際開發中,我們希望能識別出這只是同一個 model 的重命名。Git 的檔案追蹤機制可以準確識別這種重命名操作。
  2. 通用性:當需要將 PR 檢查應用到非 dbt 的程式碼時,dbt_operator 就無法使用。此時 git_diff_operator 可以作為通用的解決方案。

Git Diff Operator

主要功能

  1. 檢索異動檔案名稱
  2. 檢索異動檔案的資料夾名稱:我們團隊使用客戶名稱作為資料夾名稱來區分 dbt models,在 dry-run 時只會跑有異動的資料夾底下的所有 models(減少時間),所以需要知道異動檔案的資料夾名稱

技術實現

git_diff_operator 使用 GitPython 套件在 Python 環境中執行 git 操作。以下是範例應用:

repo = git.Repo(".")
target = repo.head.commit
source = repo.commit("HEAD^1")

diff_index = source.diff(target)

# 檢索不同類型的變更
added_files = diff_index.iter_change_type("A")    # 新增的檔案
deleted_files = diff_index.iter_change_type("D")  # 刪除的檔案
modified_files = diff_index.iter_change_type("M") # 修改的檔案
renamed_files = diff_index.iter_change_type("R")  # 重命名的檔案

檔案路徑處理

for file in renamed_files:
    old_name = file.a_path  # 變更前的檔案路徑
    new_name = file.b_path  # 變更後的檔案路徑

檔案路徑的處理規則:

  • 新增檔案:使用 b_path
  • 刪除檔案:使用 a_path
  • 修改檔案:a_pathb_path 相同
  • 重命名檔案:a_path 為原名稱,b_path 為新名稱

git_diff_operator 作為通用的檔案變更檢測模組,補充 dbt_operator 的功能限制,還幫非 dbt 專案提供了變更追蹤能力。

下一篇文章將介紹 Operator 模組的最後一個組件:bigquery_operator


上一篇
dbt 自動化檢查 - dbt Operator
下一篇
dbt 自動化檢查 - BigQuery Operators(上)
系列文
dbt 修煉之路30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言