面向.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的玩法

相关文章
相关标签/搜索