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


代碼版本管理基本上程序員們都知道 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的玩法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM