代碼版本管理基本上程序員們都知道 TFS GIT SVN等等 但是對於數據庫版本管理 java程序員或許會了解一些 但是.Net程序員收獲的資料應該不多。
特別是現在雲概念使用越來越廣的情況下,與應用程序開發和部署常規管理數據庫更改在一起便成為一個難題。
這里就分享一個用來進行sql版本管理的.net程序。源碼地址:https://github.com/dubing/SqlMigrator
如圖所示
因為只是研究着玩 暫時工具做的不復雜 提供版本跟進 回滾等基本功能
FluentMigrator : https://github.com/schambers/fluentmigrator/wiki/Migration
基於開源組件FluentMigrator通過nuget可以很方便的獲取
我們通過一個工程來專門定義管理數據庫版本。
下面我們一步一步來研究
首先最基本的是建表
這里我們創建了一個user是表並且附帶2個字段其中id是主鍵並且自增,name為一個string類型不可空並且默認值為Anonymous。
通過程序我們發現對於一次部署或者遷移我們會重寫2塊代碼 一個是up()一個是down()通過字面意思我們就可以理解到 他們分別實現的功能是向上遷移和向下回滾。
[Migration(2015031201)]中的2015031201即為我們的版本號,需要以數字組成,使用日期的方式+自定義版本號是個很好的選擇。
類名相當於描述,起着備注說明的作用。
FluentMigrator運行的方式有很多種,可以通過命令行,Nant,msbuild,Rake等等。demo程序中結合winform使用命令行方式執行。
我們先來看一下我們操作的效果,
本來我們所連的數據庫是沒有users這張表的
我們運行一下程序 執行版本跟進
執行成功,重新加載看看
已經有版本信息里,最后我們到數據庫確認一下
其實除了我們編寫的部分,FluentMigrator也會在我們的數據庫中新生成一張表versioninfo用來記錄我們的版本信息,來保證我們不會進行多余和重復的跟進或者回滾。
下面我們來繼續創建第2個部署模塊
運行demo
我們會發現程序自動略過了2015031201,重新加載數據庫
當前版本已經為新的 並且添加了履歷。數據庫也是添加成功
上面我們一直討論版本跟進 下面我們來嘗試下回滾,接着上面的demo,這個時候我們已經進行了2次部署,如果我發現最新的一次不是我想要的 我需要回滾到上面一個版本。
那么我們點擊回滾到上一次看一下
我們發現我們運行的命令不同了。同時我們的版本信息回到了上一次。
如果說我對FluentMigrator本身的語法並不了解怎么辦,沒關系。FluentMigrator本身支持sql腳本。
運行demo
細心的同學會發現 2015031202也被我們執行了 因為對於FluentMigrator而言 如果你本身回滾后不做任何處理,當下一次版本跟進的時候它會認為那次部署還是有效的。如果要T掉那個部署可以選擇在項目中注釋掉或者移除那個部署模塊。
如此看來 我們基本的版本管理動作是ok的。那么除了創建和刪除表,我們還可以進行大部分sql操作,例如更新列,添加數據,更改表名稱等等。下面我們簡單來試驗一下。
1 /// <summary> 2 ///添加列 3 /// </summary> 4 [Migration(2015031301)] 5 public class AlertUser : Migration 6 { 7 public override void Up() 8 { 9 Alter.Table("Users") 10 .AddColumn("Age") 11 .AsInt16() 12 .Nullable(); 13 } 14 15 public override void Down() 16 { 17 Delete.Column("Age").FromTable("Users"); 18 } 19 } 20 21 /// <summary> 22 /// 添加行數據 23 /// </summary> 24 [Migration(2015031302)] 25 public class AddDeptRows : Migration 26 { 27 public override void Up() 28 { 29 Insert.IntoTable("Dept").Row(new { DeptName = "maoyatest" }); 30 } 31 32 public override void Down() 33 { 34 Delete.FromTable("Dept").Row(new { DeptName = "maoyatest" }); 35 } 36 } 37 38 /// <summary> 39 /// 修改表名稱 40 /// </summary> 41 [Migration(2015031303)] 42 public class RenameUsers : Migration 43 { 44 public override void Up() 45 { 46 Rename.Table("Users").To("UsersNew"); 47 } 48 49 public override void Down() 50 { 51 Rename.Table("UsersNew").To("Users"); 52 } 53 }
看運行結果
重新加載
版本信息也正確
結果也是完全正確。
本篇先到此 希望對大家有幫助 下篇會分享下redis的玩法