Schema Inspector / information_schema 實作前確認

Schema Inspector / information_schema 實作前確認清單。

返回 docs

Schema Inspector / information_schema 實作前確認

1. 文件目的

本文件整理進入 Schema Inspector / information_schema 前需要確認的範圍、資料來源、讀取欄位、測試方式與停止條件。

此節點的目標不是執行 DDL,也不是啟動自動建表,而是先確認「如何安全讀取 MySQL 既有 schema」,讓後續 Dry Run Plan 可以從真實資料庫現況產生。

2. 目前前置狀態

項目狀態
MySQL 版本使用者指定為 MySQL 5.6.2
SQL Generator已完成 CREATE TABLE IF NOT EXISTSADD COLUMNADD INDEX
Dry Run Plan已完成第一版純程式比對
目前測試數dotnet test 通過 278 個測試
最新程式 commitdb0b1b8
真實 MySQL 連線尚未導入
DDL 執行尚未導入
MySQL 套件導入尚未在本節點執行

3. 本節點建議目標

第一版 Schema Inspector 建議只做「讀取真實 DB schema 快照」,不做任何修改。

目標說明
讀取 table 清單information_schema.TABLES 取得指定 database 的 table
讀取 column 清單information_schema.COLUMNS 取得欄位名稱、型別、nullable、預設值、comment
讀取 index 清單information_schema.STATISTICS 取得 index 名稱、欄位順序、是否 unique
讀取 primary key可由 information_schema.KEY_COLUMN_USAGESTATISTICS 判斷
轉成 schema snapshot轉成專案內部 SchemaDefinition / TableDefinition / ColumnDefinition / IndexDefinition 相容資料
提供給 Dry Run Plan將現有 DB snapshot 與目標 schema 比對

4. 明確不做的事

不做項目原因
不執行 CREATE TABLEInspector 只讀,不負責建表
不執行 ALTER TABLE避免尚未確認前修改資料庫
不執行 DROP / MODIFY / CHANGE破壞性或高風險 SQL 必須另行確認
不把密碼寫進文件或 repo避免洩漏敏感資訊
不在 Core 直接依賴 MySQL 套件避免破壞分層,DB 讀取應放在 Infrastructure 或專屬 schema 模組
不接 ConsoleHost 自動啟動流程啟動自動建表需等 Inspector、Plan、Executor 都確認後再做

5. information_schema 查詢範圍

5.1 information_schema.TABLES

建議讀取欄位:

欄位用途
TABLE_SCHEMA限制 database
TABLE_NAME對應 table name
TABLE_COMMENT對應 table description
ENGINE確認是否為 InnoDB 等預期 engine
TABLE_COLLATION後續判斷字元集與排序規則

5.2 information_schema.COLUMNS

建議讀取欄位:

欄位用途
TABLE_NAME對應所屬 table
COLUMN_NAME對應 column name
COLUMN_TYPE保留完整 MySQL 型別,例如 varchar(64)
DATA_TYPE判斷基礎型別,例如 varchardatetime
CHARACTER_MAXIMUM_LENGTH判斷字串長度
NUMERIC_PRECISION / NUMERIC_SCALE判斷數值精度
IS_NULLABLE對應 nullable
COLUMN_DEFAULT保留 default 資訊
COLUMN_COMMENT對應欄位描述
ORDINAL_POSITION保留欄位順序

5.3 information_schema.STATISTICS

建議讀取欄位:

欄位用途
TABLE_NAME對應所屬 table
INDEX_NAME對應 index name
COLUMN_NAME對應 index 欄位
NON_UNIQUE判斷 unique / non-unique
SEQ_IN_INDEX還原複合 index 欄位順序

5.4 information_schema.KEY_COLUMN_USAGE

建議用途:

用途說明
判斷 primary key可輔助確認 primary key 欄位
保留外鍵資訊第一版可先讀取但不進入自動修正

第一版可以只把外鍵列為 ManualReviewItems 或 warning,不建議自動產生 foreign key DDL。

6. MySQL 5.6.2 注意事項

項目注意事項
JSON 型別MySQL 5.6.2 不支援原生 json,仍需映射為 textvarchar
datetime 精度需避免使用較新版本才穩定支援的語法
generated column第一版不納入
online DDL第一版不依賴
collation先讀取與記錄,不在第一版自動修正
foreign key先讀取與記錄,不在第一版自動建立或修改

7. 建議程式邊界

元件建議責任
ISchemaInspector定義讀取目前 schema snapshot 的抽象介面
MySqlSchemaInspector透過 MySQL 連線讀取 information_schema
SchemaDefinition表示目標 schema 或目前 DB snapshot
MySqlSchemaSqlGenerator只負責產生 SQL 字串
SchemaMigrationPlan表示 dry run 比對結果
SchemaInitializer後續才負責串接 inspector、generator、executor

建議第一版不要把 MySQL 讀取邏輯放進 Core。Core 可以保留抽象 model 與比對結果,真實 DB 讀取應放在 Infrastructure 或專門的 MySQL schema 實作區。

8. 測試策略

測試層級建議方式
單元測試使用 fake / in-memory reader 模擬 information_schema 查詢結果
mapping 測試確認 table、column、index 可正確轉成 schema snapshot
MySQL 5.6.2 相容測試先以文件列出必要查詢語法,實際連線測試需使用者提供測試 DB
安全測試確認 Inspector 不產生 DDL、不呼叫 executor、不修改 DB
異常測試連線失敗、權限不足、database 不存在、查詢結果空集合

9. 需要使用者確認的項目

項目為什麼需要確認
是否允許導入 MySqlConnector這會新增核心資料庫連線套件
MySQL 測試 DB 連線資訊Inspector 若要做真實連線測試,需要 host、port、dbname、user 與密碼提供方式
測試帳號權限第一版建議只需要 SELECT information_schema 與目標 database metadata
是否允許新增 Infrastructure 專案或資料夾會影響專案分層與檔案位置
是否需要先只做 mock inspector可避免先接真實 DB,也能完成 mapping 與 Dry Run 串接測試

10. 建議決策

我的建議是先採用「兩段式」:

1. 先做 ISchemaInspector 與 mock / fake inspector,驗證 mapping 到 SchemaDefinition 與 Dry Run Plan 串接。 2. 再經使用者確認後導入 MySqlConnector,實作 MySqlSchemaInspector 查詢 information_schema

這樣可以先把架構與測試補齊,同時避免太早接觸真實資料庫、密碼與外部環境。

11. 建議下一步

建議下一步先做:

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

此步驟可先不導入 MySQL 套件、不連線 DB,只確認介面、回傳模型、錯誤格式與測試案例。

若要直接進入真實 MySQL Inspector,則需先確認: