面向.Net程序員的Sql版本管理

代碼版本管理基本上程序員們都知道 TFS GIT SVN等等 可是對於數據庫版本管理 java程序員或許會了解一些 可是.Net程序員收穫的資料應該很少。java

特別是如今雲概念使用愈來愈廣的狀況下,與應用程序開發和部署常規管理數據庫更改在一塊兒便成爲一個難題。git

這裏就分享一個用來進行sql版本管理的.net程序。源碼地址:https://github.com/dubing/SqlMigrator程序員


如圖所示github

由於只是研究着玩 暫時工具作的不復雜 提供版本跟進 回滾等基本功能redis

FluentMigrator : https://github.com/schambers/fluentmigrator/wiki/Migrationsql

基於開源組件FluentMigrator經過nuget能夠很方便的獲取數據庫

咱們經過一個工程來專門定義管理數據庫版本。ide

下面咱們一步一步來研究工具

首先最基本的是建表ui

這裏咱們建立了一個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的玩法

相關文章
相關標籤/搜索