提取 Select 欄位與條件,協助開發者掌握舊系統隱藏邏輯
自動化作業工具系列分享
透過工具自動化剖析 SQL,取代傳統「人工肉眼看 Code、手動盤點欄位」的高風險作業模式。
痛點一 邏輯黑盒子:舊系統動輒數百行的 SQL 視圖,隱藏了關鍵的商業運算邏輯。
痛點二 文件與程式脫節:資料庫欄位名稱改變,但系統交接文件早已年久失修。
痛點三 人工作業極限:人工比對 SELECT 欄位與 WHERE 條件,耗時且極易發生漏看的人為疏失。
在我們整理《自動化作業工具操作手冊彙編》的過程中,發現組織內充滿了各種自動化需求,例如:
我們希望能將這套「解析 SQL 指令以取得初步結果」的思維,轉化為具體的系統開發架構。
SQL 解析器 (Parser) 是一支能將純文字的 SQL 語句,轉化為電腦可理解的結構化資料的程式。
SELECT a.id, b.name
FROM orders a
JOIN users b ON a.uid = b.id
WHERE a.amt > 1000
{
"fields": ["a.id", "b.name"],
"tables": ["orders", "users"],
"conditions": ["a.amt > 1000"]
}
將 SQL 文字轉換為結構化資料,通常經歷三個階段:
如同將一段話拆解為單字。Lexer 會忽略空白與註解,將 SQL 切割成最小單位的 Token。
輸入:SELECT id FROM users
輸出 Token 陣列:
[KEYWORD] : SELECT[IDENTIFIER] : id[KEYWORD] : FROM[IDENTIFIER] : usersParser 負責檢查這些 Token 是否符合 SQL 文法,如果正確,就會建立出抽象語法樹 (Abstract Syntax Tree)。
在 AST 中,所有的查詢都被組織成階層結構:
當我們掌握了 AST,就能針對 Columns List 節點進行尋訪。
設計重點:
u.user_name AS Name,需同時記錄原始欄位與別名。SUM(amount),需判斷並標記這是一個運算結果,而非單一實體欄位。SELECT *,必須依賴資料庫 Schema 才能還原實體欄位。理解舊系統的精髓,在於理解資料表之間是如何互動的。
走訪 From Clause 時,我們需萃取:
WHERE 節點通常是一個二元樹 (Binary Tree) 的結構(AND / OR)。
提取挑戰:
(A AND B) OR C 需精準還原條件組合。WHERE id = @userId,協助後端工程師盤點 API 必填參數。status = 'ACTIVE')。呼應我們《操作手冊彙編》中的極簡精神,工具操作應保持直覺:
當 SQL 變成了結構化資料 (JSON),我們就能無限擴充它的應用!
自動化工具的價值,在於將重複且高風險的工作,
轉交給可靠的程式碼去執行。