MySqlSchemaInspector Query Builder / Row Mapper 設計

返回文件首頁

MySqlSchemaInspector Query Builder / Row Mapper 設計

1. 文件目的

本文件整理 MySqlSchemaInspector 第一版的純程式設計,聚焦在 query builder、row mapper、snapshot assembly、錯誤處理與單元測試。

此設計仍不導入 MySqlConnector、不修改 .csproj、不建立真實 connection string、不連線 MySQL、不讀取真實 information_schema,也不執行任何 DDL。

2. 設計結論

第一版建議先把真實 MySQL Inspector 拆成三個可單獨測試的區塊:

區塊職責是否需要真實 DB
Query Builder產生 information_schema 查詢與參數名稱
Row Mapper將 table / column / index metadata row 轉成中間模型
Snapshot Assembler將中間模型組成 schema snapshot

這樣可以先驗證 MySQL 5.6.2 metadata 規則與 mapping 邏輯,等設計穩定後再確認是否導入 MySqlConnector

3. 建議元件切分

元件建議名稱職責
query builderMySqlSchemaInspectorQueryBuilder產生 tables / columns / indexes 查詢
metadata rowMySqlTableMetadataRow / MySqlColumnMetadataRow / MySqlIndexMetadataRow表示從 information_schema 讀出的原始欄位
row mapperMySqlSchemaMetadataMapper將 metadata row 轉成 schema model 所需資訊
snapshot assemblerMySqlSchemaSnapshotAssembler依 table name 合併 table / column / index
inspectorMySqlSchemaInspector後續負責協調連線、查詢、mapping 與 result

若實作時覺得元件過多,第一版可以先合併 mapper 與 assembler,但 query builder 建議保留獨立,方便測試參數化查詢。

4. Query Builder 設計

4.1 共通原則

每個 query 都必須符合:

4.2 Table Query

用途:讀取指定 database 內的 table 清單。

建議欄位:

欄位對應
TABLE_NAMEtable name
TABLE_COMMENTtable description
ENGINEtable engine
TABLE_COLLATIONtable collation

建議排序:

ORDER BY TABLE_NAME

4.3 Column Query

用途:讀取 table 欄位 metadata。

建議欄位:

欄位對應
TABLE_NAME所屬 table
COLUMN_NAME欄位名稱
COLUMN_TYPE完整型別,例如 varchar(64)
DATA_TYPE基礎型別,例如 varchar
CHARACTER_MAXIMUM_LENGTH字串長度
NUMERIC_PRECISION數值精度
NUMERIC_SCALE小數位數
IS_NULLABLEnullable
COLUMN_DEFAULTdefault value
COLUMN_COMMENT欄位描述
ORDINAL_POSITION欄位順序

建議排序:

ORDER BY TABLE_NAME, ORDINAL_POSITION

4.4 Index Query

用途:讀取 index 與 primary key metadata。

建議欄位:

欄位對應
TABLE_NAME所屬 table
INDEX_NAMEindex name
COLUMN_NAMEindex 欄位
NON_UNIQUEunique 判斷
SEQ_IN_INDEX複合 index 欄位順序

建議排序:

ORDER BY TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX

INDEX_NAME = 'PRIMARY' 時應轉成 primary key metadata,不應當成一般 index。

5. Table Filter 設計

第一版支援兩種模式即可:

模式行為
無指定 table讀取 database 內全部 table metadata
指定 table names加入 TABLE_NAME IN (...) 條件

注意事項:

6. Row Mapper 設計

6.1 Table Row

輸入Mapping
TABLE_NAMErequired
TABLE_COMMENTnull 時轉空字串
ENGINE保留 metadata,可作 warning 判斷
TABLE_COLLATION保留 metadata,可作 warning 判斷

若缺少 TABLE_NAME,應回傳標準錯誤。

6.2 Column Row

輸入Mapping
COLUMN_NAMErequired
COLUMN_TYPE作為第一版型別比對主要來源
DATA_TYPE作為基礎型別與 warning 判斷
IS_NULLABLEYES 轉 true,NO 轉 false
COLUMN_DEFAULT保留原始值
COLUMN_COMMENTnull 時轉空字串
ORDINAL_POSITION用於排序

型別比對第一版建議保留完整 COLUMN_TYPE,不要過度正規化,避免 MySQL 5.6.2 的細節被吃掉。

6.3 Index Row

輸入Mapping
INDEX_NAMErequired
COLUMN_NAMErequired
NON_UNIQUE0 轉 unique,1 轉 non-unique
SEQ_IN_INDEX欄位順序

同一個 TABLE_NAME + INDEX_NAME 的多筆 row 應合併成同一個 index,欄位依 SEQ_IN_INDEX 排序。

7. Snapshot Assembly 設計

組裝順序建議:

第一版建議:

8. Result 與錯誤格式

建議 query builder / mapper / assembler 各自保留可測試的結果:

元件成功輸出失敗輸出
Query BuilderSQL + parameter namesvalidation error
Row Mappermetadata row modelmissing required field error
Snapshot Assemblerschema snapshot + warningsassembly error

錯誤資訊至少包含:

9. 單元測試設計

第一批測試不依賴真實 DB,建議包含:

測試預期
Table query 必含 TABLE_SCHEMA = @DatabaseName避免讀到其他 database
Column query 依 TABLE_NAME, ORDINAL_POSITION 排序輸出穩定
Index query 依 TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX 排序複合 index 順序穩定
table filter 產生參數化 IN 條件不直接拼接 table name
空 table filter 不產生 IN ()避免 SQL 錯誤
nullable mappingYES / NO 正確轉換
unique mappingNON_UNIQUE 正確轉換
primary key mappingPRIMARY 不當成一般 index
複合 index assembly欄位順序正確
缺少 required metadata回傳標準錯誤
不存在 table 的 column / index回傳 warning

10. 實作前停止線

以下仍需先確認,不得在本設計自動執行:

事項原因
導入 MySqlConnector新增套件
修改 .csproj影響 restore / build
實作真實 DB connection外部服務與密碼管理
讀取真實 information_schema真實 DB metadata 存取
修改 public method 簽章可能破壞既有契約
改 ConsoleHost 啟動參數影響使用流程
執行任何 DDL會修改資料庫

11. 建議下一步

若使用者尚未確認導入 MySqlConnector,下一步建議先做「Query Builder / Row Mapper 實作前確認」,把要新增的 class、method、測試檔與不改 public contract 的方式列清楚。

若使用者確認可導入 MySqlConnector,再進入 MySqlConnector 套件導入與真實 Inspector 第一版實作。

返回文件首頁