歡迎光臨
每天分享高質量文章

[NewLife.XCode]反向工程(自動建表建庫大殺器)

NewLife.XCode是一個有10多年曆史的開源資料中介軟體,支援nfx/netstandard,由新生命團隊(2002~2019)開發完成並維護至今,以下簡稱XCode。

整個系列教程會大量結合示例程式碼和執行日誌來進行深入分析,蘊含多年開發經驗於其中,代表作有百億級大資料實時計算專案。

開源地址:https://github.com/NewLifeX/X (求star, 656+)

回到目錄

大殺器

反向工程是XCode的大殺器,區別於其它ORM的最強功能!

通俗理解:基於XCode開發的應用,無需資料庫安裝指令碼,連線字串指向哪一臺哪一種資料庫,系統就自動在上面建庫建表!

正式定義:基於物體類的表結構資訊,在連線字串指定的標的資料庫上自動執行建庫建表、添刪改欄位、建立索引等操作,支援各種資料庫!

應用系統首次啟動完成的時候,也是自動建表建庫並初始化完成的時候。

反向工程是XCode數萬級分表的主要倚仗!

建立控制檯專案,從Nuget取用NewLife.XCode

建立物體類,模型如下(可參考前面幾章來生成物體類):

 測試程式碼:

 執行日誌:

自始至終,我們沒有編寫SQL指令碼,沒有去資料庫建立資料表。

程式碼寫完就跑起來,測試透過就部署到正式庫。

從日誌來看,程式自動下載SQLite驅動,因為我們並沒有指定物體類使用哪一種資料庫,XCode自動給我們配置了SQLite。(上一章連線字串部分有講解)

加一行程式碼把資料庫指向MySql:

 執行日誌:

同樣的首先下載MySql驅動,(當然也可以自己透過nuget取用)。

首次連線資料庫時,庫名指定School報錯,因為根本就不存在這個庫。

因此,XCode切換到系統庫,開始建立資料庫School,並建立資料表和索引。這裡完全是MySql語法,不同於上面的SQLite建表陳述句。

感興趣的同學,還可以試試Oracle和SqlServer等資料庫。

回到目錄

正向工程

正向工程就是從資料庫讀取表結構資訊,生成模型資訊。

我們來試試寫幾行程式碼讀取上面建立的資料表:

執行日誌:

從上面可以看到,讀取dal.Tables得到了這個連線的所有表結構資訊,輸出為Xml時,跟前面用來建立物體類的模型檔案極為相似。

其實這就是一個模型檔案,只是為了生成物體類的模型檔案多增加了幾個屬性而已。

新生命碼神工具XCoder,(https://github.com/NewLifeX/XCoder),其中的資料建模工具,可以匯出各種資料庫的表結構資訊,正是基於dal.Tables來實現。

正向工程由3個基本介面構成:

  • IDataTable。資料表介面,dal.Tables就是IDataTable集合,包括名稱、描述等
  • IDataColumn。資料列介面,每張資料表有多個資料列,包括名稱、型別、長度、描述等
  • IDataIndex。資料索引介面,每張資料表沒有或者有多個索引,索引指定包括哪些欄位 ,是否唯一

回到目錄

反向工程

有了IDataTable,我們就可以主動控制資料表結構。

DAL.SetTables(IDataTable[] tables);

這是反向工程高階用法,實際日常工作中用不到,各個物體類載入時,將會逐個連線進行反向工程檢查,正是呼叫該方法。

給上面的資料模型,增加一個欄位Code和對應索引:

跑起來:

程式自動為我們添加了欄位,以及建立了索引!

前面的幾個SHOW,就是XCode的正向工程,取得資料庫表結構,然後跟物體類結構對比,不相同時執行反向操作。

回到目錄

反向工程設定

大家還記得上一章系統設定中提到的Migration嗎?

XCode.config和連線字串中都支援這個設定。

可用設定項如下:

  • Off 關閉,不執行反向工程
  • ReadOnly 只讀不執行,非同步執行反向工程檢查,對比後生成變更DDL寫入日誌
  • On 開啟,僅新建,預設設定。新建表、增加欄位、建立索引等可以執行,禁止修改欄位長度型別,禁止刪除欄位,以免造成資料丟失
  • Full 完全,修改刪除。除了新建表、增加欄位、建立索引外,還可以修改欄位長度型別、刪除欄位等,極其危險,慎用

反向工程設計於2008年,10多年經驗表明,預設On最合理,不僅滿足開發需要,(隨時加欄位),還避免了欄位改變而導致的資料丟失風險;

反向工程如此神奇的功能,你想到了什麼高階用法嗎?我們將在數萬級分表分庫章節等你!

回到目錄

系列教程

NewLife.XCode教程系列[2019版]

  1. 增刪改查入門。快速展現用法,程式碼配置連線字串
  2. 資料模型檔案。建立表格欄位和索引,名字以及資料型別規範,推薦欄位(時間,使用者,IP)
  3. 物體類詳解。資料類業務類,泛型基類,介面
  4. 功能設定。連線字串,除錯開關,SQL日誌,慢日誌,引數化,執行超時。程式碼與配置檔案設定,連線字串區域性設定
  5. 反向工程。自動建立資料庫資料表
  6. 資料初始化。InitData寫入初始化資料
  7. 高階增刪改。多載攔截,自增欄位,Valid驗證,物體模型(時間,使用者,IP)
  8. 臟資料。如何產生,怎麼利用
  9. 增量累加。高併發統計
  10. 事務處理。單表和多表,不同連線,多種寫法
  11. 擴充套件屬性。多表關聯,Map對映
  12. 高階查詢。複雜條件,分頁,自定義擴充套件FieldItem,查總記錄數,查彙總統計
  13. 資料層快取。Sql快取,更新機制
  14. 物體快取。全表整理快取,更新機制
  15. 物件快取。字典快取,適用使用者等資料較多場景。
  16. 百億級效能。欄位精煉,索引完備,合理查詢,充分利用快取
  17. 物體工廠。元資料,通用處理程式
  18. 角色許可權。Membership
  19. 匯入匯出。Xml,Json,二進位制,網路或檔案
  20. 分表分庫。常見拆分邏輯
  21. 高階統計。聚合統計,分組統計
  22. 批次寫入。批次插入,批次Upsert,非同步儲存
  23. 物體佇列。寫入級快取,提升效能。
  24. 備份同步。備份資料,恢復資料,同步資料
  25. 資料服務。提供RPC介面服務,遠端執行查詢,例如SQLite網路版
  26. 大資料分析。ETL抽取,排程計算處理,結果持久化

 

受蘋果公司新規定影響,微信 iOS 版的贊賞功能被關閉,可透過二維碼轉賬支援公眾號。

    贊(0)

    分享創造快樂