MySqlSchemaInspector 實作前確認清單

返回文件首頁

MySqlSchemaInspector 實作前確認清單

1. 文件目的

本文件整理進入 MySqlSchemaInspector 第一版實作前需要確認的工程邊界、實作位置、套件導入條件、query builder、row mapping、測試案例與人工驗證節點。

此節點仍然是「實作前確認」,不會導入 MySqlConnector、不會建立真實連線字串、不會連線 MySQL、不會讀取真實 information_schema,也不會執行任何 DDL。

2. 前置條件

項目狀態
MySQL 版本使用者指定為 MySQL 5.6.2
Schema Attribute / SQL Generator已完成第一版
ISchemaInspector已完成抽象與 mock inspector
SchemaDryRunPlanner已完成 mock snapshot 比對
SchemaInitializer DryRun已完成第一版
ConsoleHost 顯示已可顯示 Schema Initializer DryRun 結果
真實 MySQL Inspector 前置確認已完成
自動測試dotnet test 通過 318 個測試
最新程式 commitac52376

3. 本節點建議結論

可以準備進入 MySqlSchemaInspector 第一版實作,但第一版建議拆成兩段:

段落內容是否需要真實 DB
A. 純程式準備建立 query builder、row mapping、result mapping 與單元測試
B. 真實 DB 驗證導入套件、連線唯讀 MySQL、讀取 information_schema是,需另行確認

本次建議先做 A 段,等 A 段完成後,再由使用者確認是否進入 B 段。

4. 實作位置建議

類型建議位置說明
MySqlSchemaInspectorInfrastructure 或 schema 專屬 infrastructure 區需依賴 MySQL provider,不應放在 Core
query builderMySqlSchemaInspector 同區或內部 helper負責產生 information_schema 查詢,不持有密碼
row mapper與 inspector 同區將 table / column / index rows 轉成 schema snapshot
connection settingsInfrastructure config model不放密碼預設值,不寫進 repo
tests對應測試專案用假資料列測 mapping,不需真實 DB

Core 仍只保留 schema model 與抽象契約,不直接引用 MySQL 套件。

5. 套件導入條件

導入 MySqlConnector 前需再次確認:

確認項原因
是否允許新增 NuGet packageAGENTS 規則要求新增核心套件前需確認
套件版本需相容 .NET 5.0
放置專案建議只放在 Infrastructure / MySQL 實作專案,不放 Core
CI 還原確認 GitHub Actions 能還原套件
連線字串來源不得寫死在 repo
測試策略單元測試不依賴真實 DB,真實 DB 驗證另列人工節點

若使用者尚未確認,下一步只能做文件與設計,不可直接修改 .csproj

6. Query Builder 範圍

第一版 query builder 建議只產生三類查詢:

查詢來源目的
Table queryinformation_schema.TABLES取得指定 database 內的 table
Column queryinformation_schema.COLUMNS取得指定 database 內的欄位
Index queryinformation_schema.STATISTICS取得指定 database 內的 index 與 primary key

6.1 共用條件

每個查詢都必須包含:

6.2 Table query 欄位

欄位目的
TABLE_NAMEtable 名稱
TABLE_COMMENTtable 描述
ENGINEengine
TABLE_COLLATIONcollation

6.3 Column query 欄位

欄位目的
TABLE_NAMEtable 名稱
COLUMN_NAME欄位名稱
COLUMN_TYPE完整 MySQL 型別
DATA_TYPE基礎型別
IS_NULLABLEnullable
COLUMN_DEFAULTdefault value
COLUMN_COMMENT欄位描述
ORDINAL_POSITION欄位順序
CHARACTER_MAXIMUM_LENGTH字串長度
NUMERIC_PRECISION / NUMERIC_SCALE數值精度

6.4 Index query 欄位

欄位目的
TABLE_NAMEtable 名稱
INDEX_NAMEindex 名稱
COLUMN_NAME欄位名稱
NON_UNIQUE判斷 unique
SEQ_IN_INDEX複合 index 欄位順序

7. Row Mapping 規則

Row mapping 第一版需處理:

情境規則
table 無 comment保留空字串,不視為錯誤
column default 為 null區分「沒有 default」與「default null」的表示方式
IS_NULLABLEYES 對應 nullable,其他視為 not nullable
NON_UNIQUE0 對應 unique,1 對應 non-unique
INDEX_NAME = PRIMARY轉成 primary key metadata
複合 indexSEQ_IN_INDEX 排序
未預期型別不直接失敗,轉成 manual review warning
資料列缺少必要欄位回傳標準錯誤,不吞 exception

8. Error / Result 規則

MySqlSchemaInspector 不應只回傳 bool,也不應讓未處理 exception 直接外拋到 Host。

建議錯誤至少包含:

建議先沿用既有 SchemaInspectResult / ErrorInfo 風格;若需新增公開欄位或改 public method 簽章,必須先停下確認。

9. 測試案例

不連真實 DB 的第一批測試建議包含:

測試預期
Table query 包含 database filter查詢必須使用 @DatabaseName
Column query 包含排序欄位需依 table / ordinal position 排序
Index query 可還原複合 index多欄位 index 依 SEQ_IN_INDEX 排序
nullable mappingYES / NO 正確轉換
unique mappingNON_UNIQUE = 0 轉 unique
primary key mappingINDEX_NAME = PRIMARY 可辨識
table / column comment 空值不失敗
metadata row 缺少必要欄位回傳標準錯誤
未知型別產生 warning 或 manual review,不直接套用

10. 人工驗證節點規劃

等使用者確認可以連真實 MySQL 後,需建立人工驗證節點。

人工驗證回報至少包含:

項目說明
驗證節點名稱真實 MySQL Inspector metadata 讀取驗證
驗證目的確認唯讀帳號可讀指定 database metadata
驗證方式使用指定 Host / Port / Database / User,Password 由安全來源提供
實際結果讀到 table / column / index 數量
是否符合預期是否只讀指定 database,是否未執行 DDL
發現問題權限、連線、型別、comment、collation 差異
下一步是否串接 Dry Run Plan 或補 mapping 規則

11. 必須停下確認的事項

以下事項不得在本節點自動執行:

事項原因
新增 MySqlConnector新增套件需確認
修改 .csproj會影響程式 repo build / restore
新增真實 connection settings可能涉及密碼與環境資訊
連線 MySQL外部服務操作需確認
讀取真實 information_schema進入真實 DB metadata
修改 public method 簽章可能影響既有契約
修改 ConsoleHost 啟動方式影響使用流程
執行任何 DDL會修改資料庫

12. 建議下一步

建議下一步先向使用者確認是否允許導入 MySqlConnector

若尚未允許導入套件,可先做更細的「Query Builder / Row Mapper 設計」,仍不碰 .csproj

返回文件首頁