zoukankan      html  css  js  c++  java
  • 面向.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的玩法

  • 相关阅读:
    2. 逻辑运算
    1. 条件
    6. 可变不可变类型
    5. 基本运算符
    4. 与用户交互
    12 .命名的EIGRP和EIGRP v6
    11. EIGRP路由SIA
    Redis 快速入门 -- Redis 快速入门(2)
    Redis 快速入门 -- Redis教程(1)
    Redis 百度百科
  • 原文地址:https://www.cnblogs.com/dubing/p/4335200.html
Copyright © 2011-2022 走看看