Schema Inspector 抽象介面與 mock inspector 實作前確認

Schema Inspector 抽象介面與 mock inspector 實作前確認清單。

返回 docs

Schema Inspector 抽象介面與 mock inspector 實作前確認

1. 文件目的

本文件整理進入 Schema Inspector 第一版程式實作前的確認項目。

此節點只處理抽象介面、mock inspector、schema snapshot 回傳模型與測試案例,不導入 MySQL 套件、不連線 MySQL、不讀取 information_schema,也不執行 DDL。

這樣做的目的,是先把「Inspector 讀出目前 schema」與「Dry Run Plan 比對目標 schema」的程式接縫驗證起來,避免一開始就被真實資料庫、密碼、網路與權限問題卡住。

2. 本節點範圍

項目是否納入說明
ISchemaInspector 抽象介面納入定義讀取目前 schema snapshot 的契約
MockSchemaInspector / FakeSchemaInspector納入測試與 ConsoleHost 前置驗證可使用
schema snapshot model納入優先沿用既有 SchemaDefinition / TableDefinition / ColumnDefinition / IndexDefinition
Inspector result納入需能表達成功、失敗、錯誤與警告
Dry Run Plan 串接測試納入用 mock snapshot 驗證與目標 schema 比對
MySQL 套件不納入不新增 MySqlConnector
真實 MySQL 連線不納入不需要 host / port / user / password
information_schema 查詢不納入留到真實 MySQL Inspector 節點
DDL 執行不納入不建立、不修改、不刪除資料表

3. 建議介面設計

建議先建立抽象介面,讓後續可替換 mock inspector 與真實 MySQL inspector。

public interface ISchemaInspector
{
    SchemaInspectResult Inspect(SchemaInspectRequest request);
}

建議不要讓介面直接依賴 MySQL 連線物件,也不要把 connection string 放進 Core 介面。

4. 建議 request model

SchemaInspectRequest 建議包含:

欄位說明
DatabaseName目標 database 名稱;mock inspector 可用來標示測試情境
ExpectedTables可選,限制只讀取或回傳指定 table
IncludeIndexes是否包含 index snapshot
IncludeComments是否包含 table / column comment
CorrelationId方便 log 與測試追蹤

第一版也可以先不建立複雜 options,只保留必要欄位,避免過早設計。

5. 建議 result model

SchemaInspectResult 建議包含:

欄位說明
Success是否讀取成功
Schema成功時回傳目前 schema snapshot
Warnings可繼續執行但需提醒的項目
Error失敗時回傳標準錯誤資訊
TimeTakenMs執行耗時
Source例如 MockMySQL information_schema

錯誤格式需盡量沿用既有 Result / ErrorInfo 風格,不要只回傳 bool 或丟出未處理 exception。

6. Mock inspector 行為

建議第一版 mock inspector 支援下列情境:

情境行為
回傳空 databaseSchemaDefinition 中無 table
回傳既有完整 schema模擬 DB 已符合目標 schema
回傳缺少 column讓 Dry Run Plan 產生 ColumnsToAdd
回傳缺少 index讓 Dry Run Plan 產生 IndexesToAdd
回傳欄位型別不同讓 Dry Run Plan 產生 ManualReviewItems
模擬讀取失敗回傳標準 ErrorInfo,不吞 exception

Mock inspector 不應該假裝連線 MySQL,也不應該藏入任何真實連線資訊。

7. 建議放置位置

類型建議位置
抽象介面若只使用 schema model,可放在 Core schema 區;若會牽涉外部連線,需放 Infrastructure
Mock inspector優先放測試專案或測試 helper;若 ConsoleHost 需要展示,可放 Infrastructure / Mock 實作區
真實 MySQL inspector後續放 Infrastructure 或 MySQL schema 實作區,不放 Core

若現有程式 repo 已經有 Schema 資料夾與 SQL Generator,第一版可以先把純抽象與 mock 放在同一個低風險區域,但需避免讓 Core 依賴 MySQL 套件。

8. 測試案例建議

測試案例驗證目的
mock inspector 可回傳空 schema確認空 DB snapshot 可表示
mock inspector 可回傳既有 table / column / index確認 snapshot model 可承載資料
mock snapshot 與目標 schema 相同Dry Run Plan 不應產生 SQL
mock snapshot 缺少 columnDry Run Plan 應產生 ADD COLUMN
mock snapshot 缺少 indexDry Run Plan 應產生 ADD INDEX
mock snapshot 欄位型別不同Dry Run Plan 應進 ManualReviewItems
mock inspector 失敗result 應包含標準錯誤資訊
inspector 不產生 DDL確認 inspector 只讀 snapshot,不產生 SQL、不執行 SQL

9. 實作前需確認

確認項目建議
是否先做 mock inspector建議先做
是否新增 MySQL 套件本節點不新增
是否改 public method 簽章避免改既有 public 簽章,新增介面與 model 即可
是否改啟動方式不改
是否需要 ConsoleHost 展示本節點先不接 ConsoleHost,避免擴大範圍
是否需要文件同步需要,完成後同步開發進度

10. 建議決策

建議採用:

先建立 ISchemaInspector + mock inspector + 單元測試,不碰真實 MySQL。

原因:

11. 建議下一步

若確認本文件方向,下一步可進入:

Schema Inspector 抽象介面與 mock inspector 第一版實作

實作時建議只包含:

仍不做: