SQL Generator ?????

?? MySqlSchemaSqlGenerator ???????????????????????????????

?? docs

SQL Generator 實作前確認

1. 文件目的

本文件用於整理進入程式 repo 實作 MySqlSchemaSqlGenerator 前的確認項目。

目前已完成:

本文件只確認「SQL 字串產生器」的第一批實作範圍,不代表已經同意實際連線 MySQL、執行 DDL、建立資料表、修改專案啟動方式或導入 WebApi / ServiceHost。

2. 建議結論

建議下一步先做:

MySqlSchemaSqlGenerator 第一版,只產生 CREATE TABLE IF NOT EXISTS SQL 字串。

第一版先不做:

理由:

3. 第一批允許範圍

類別允許內容
SQL GeneratorMySqlSchemaSqlGenerator
OptionsMySqlSchemaSqlGeneratorOptions
輸入TableDefinitionSchemaDefinition
輸出CREATE TABLE IF NOT EXISTS SQL 字串
驗證table / column / index 命名、type 白名單、comment escaping
測試xUnit 單元測試
文件更新實作紀錄與下一步

4. 第一批禁止範圍

類別不做內容原因
DB 連線不連線 MySQL尚未進入連線驗證節點
DDL 執行不執行 CREATE TABLE避免誤改資料庫
Schema Initializer不做啟動時自動建表需等 SQL Generator 驗收後
ALTER TABLE不補欄位、不補索引需先有 schema diff 設計
套件不新增 MySQL 套件純字串產生器不需要 DB driver
啟動方式不改 ConsoleHost / API 啟動流程避免擴大範圍
資料模型不新增 TaskStore record 欄位先沿用既有 schema class 草案

5. 建議放置位置

目前 Schema Attribute 與 Parser 位於:

src/HS.DeviceControl.Core/Schema

第一版 SQL Generator 建議先放在同一個 Schema 命名空間下,理由:

後續若進入 MySQL 連線、TaskStore、SchemaInitializer,才再評估搬到:

src/HS.DeviceControl.Infrastructure

或新增 DB 專案。

6. 建議類別清單

類別責任
MySqlSchemaSqlGeneratorTableDefinition 產成 MySQL CREATE TABLE SQL
MySqlSchemaSqlGeneratorOptions控制 Engine、Charset、是否使用反引號
MySqlSchemaTypeValidator驗證 MySQL 5.6.2 型別白名單
MySqlIdentifierValidator驗證 table / column / index 命名
MySqlSqlEscaper處理 identifier 包裝與 comment escaping

若第一批想再縮小,可先只建立:

其他 helper 可先做成 private method,但測試要覆蓋行為。

7. Options 建議

public sealed class MySqlSchemaSqlGeneratorOptions
{
    public string Engine { get; set; } = "InnoDB";
    public string Charset { get; set; } = "utf8";
    public bool QuoteIdentifiers { get; set; } = true;
}

第一版不建議開放:

8. SQL 產出規則

8.1 Table

輸出格式:

CREATE TABLE IF NOT EXISTS `task_executions` (
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='任務執行紀錄';

規則:

8.2 Column

輸出格式:

`task_id` varchar(64) NOT NULL COMMENT '任務識別碼'

規則:

8.3 Primary Key

輸出格式:

PRIMARY KEY (`task_id`)

規則:

8.4 Index

輸出格式:

INDEX `idx_task_executions_status` (`status`)

唯一索引:

UNIQUE INDEX `uk_task_executions_task_id` (`task_id`)

規則:

9. Identifier 規則

建議第一版規則:

^[A-Za-z][A-Za-z0-9_]*$

適用:

禁止:

說明:

欄位描述可以中文,但 DB identifier 第一版先固定英文與底線,方便跨工具、跨系統維護。

10. Type 白名單

第一版建議允許:

類型允許格式
字串varchar(n),n 建議 1 到 255
長文字textlongtext
整數intbigint
小數decimal(p,s)
時間datetime
布林tinyint(1)

第一版禁止:

11. 錯誤處理

建議沿用既有錯誤碼:

SchemaDefinitionInvalid

需能辨識:

錯誤情境預期
table name 空白回傳錯誤,不產 SQL
table name 格式不合法回傳錯誤,不產 SQL
column name 空白回傳錯誤,不產 SQL
column type 空白回傳錯誤,不產 SQL
column type 不在白名單回傳錯誤,不產 SQL
primary key 缺失回傳錯誤,不產 SQL
index 指向不存在欄位回傳錯誤,不產 SQL

若既有 Parser 已擋下部分錯誤,SQL Generator 仍需做防呆,避免未來被其他來源直接呼叫。

12. 測試清單

測試項目預期結果
產出單一 tableSQL 包含 CREATE TABLE IF NOT EXISTS
產出 primary keySQL 包含 PRIMARY KEY
required columnSQL 包含 NOT NULL
nullable columnSQL 包含 NULL
一般 indexSQL 包含 INDEX
unique indexSQL 包含 UNIQUE INDEX
comment 含單引號SQL 正確 escape
table name 不合法回傳錯誤
type 不合法回傳錯誤
index 指向不存在欄位回傳錯誤
MySQL 5.6.2 不支援型別回傳錯誤

13. 驗收標準

完成 SQL Generator 第一版後,需達成:

14. 仍需使用者確認

進入程式 repo 前,建議確認:

確認項目建議值是否可先採用
第一版是否只做 CREATE TABLE可先採用
是否先不連線 MySQL可先採用
是否先不做 ALTER TABLE可先採用
EngineInnoDB可先採用
Charsetutf8可先採用
Identifier 是否只允許英文 / 數字 / 底線可先採用
Type 白名單是否採用本文件可先採用

15. 建議下一步

建議下一步:

進行 MySqlSchemaSqlGenerator 第一版實作前 commit/push 前確認

確認後再切換到程式 repo 實作:

  1. MySqlSchemaSqlGeneratorOptions
  2. MySqlSchemaSqlGenerator
  3. SQL escaping / validation helper
  4. xUnit 測試

完成後再回文件 repo 更新進度與驗證紀錄。