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

代码版本管理基本上程序员们都知道 TFS GIT SVN等等 但是对于数据库版本管理 java程序员或许会了解一些 但是.Net程序员收获的资料应该不多。

特别是现在云概念使用越来越广的情况下,与应用程序开发和部署常规管理数据库更改在一起便成为一个难题。

这里就分享一个用来进行sql版本管理的.net程序。



如图所示

因为只是研究着玩 暂时工具做的不复杂 提供版本跟进 回滚等基本功能

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         }

看运行结果

重新加载

版本信息也正确

结果也是完全正确。源码修缮完成后会放到我的github上。



本篇先到此 希望对大家有帮助 下篇会分享下redis的玩法

时间: 2024-11-10 14:54:47

面向.Net程序员的Sql版本管理的相关文章

面向.Net程序员的前端优化

背景 作为web开发人员大家大多了解一些网站的性能优化方法,其实大部分方法都不复杂,例如针对前端js和css的压缩来减少请求大小,通过合并来减少请求次数.这里站在.Net后端程序员的角度来看一下如何最简单快捷的处理这一类需求. 全文分3节 combres,mvc4的Bundle,以及2者的对比和个人的意见观点. 弄了个很张扬的点赞样式,如果觉得很想吐槽请告诉我,我删掉... Combres Combres是一个.NET程序库,能够缩小,压缩,合并,以及缓存的JavaScript和CSS资源,AS

面向.Net程序员的后端性能优化实战

最近2个月没做什么新项目 完全是对于旧的系统进行性能优化 避免超时 死锁 数据处理能力不够等常见的性能问题 这里不从架构方面出发 毕竟动大手脚成本比较高 那么我们以实例为前提 从细节开始 优化角度 一.业务逻辑优化 二.DB优化 三.数据处理优化 四.锁与性能 五.cpu飙高小结 六.crash现象分析 业务逻辑优化 这一条不具有普遍性 不同的业务不同的场景 如果归纳起来 就是在不影响业务的前提下进行流程精简 1. 废弃冗余逻辑 常见于各种基于数据库的检查 很多同学在维护别人代码的时候 没有深入

面向.Net程序员的dump分析

背景 Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到dump文件中.在 Windows 系统上, dump 文件分为内核 dump 和用户态 dump 两种.前者一般用来分析内核相关的问题,比如驱动程序:后者一般用来分析用户态程序的问题. 一般的程序员可能接触不到dump文件,反而是运维会用的多一些.不过如果你抗战在第一线,学会dump的分析无疑是掌握一柄利器.因为很多场景下,在线下的单元测试或者性能测试中由于测试用例的不充分或者生产与测试环境的硬件以及pv量级的不同等等情况

程序员的SQL经典笔记1_自动增长字段

自动增长字段在设计数据库的时候,有时需要表的某个字段是自动增长的,最常使用自动增长字段的就是表的主键,使用自动增长字段可以简化主键的生成.不同的DBMS中自动增长字段的实现机制也有不同,下面分别介绍. MYSQL 中设定一个字段为自动增长字段非常简单,只要在表定义中指定字段为AUTO_INCREMENT即可.例子: create table t_student ( t_id int primary key auto_increment, t_name varchar(50), t_age int

面向.Net程序员的VS扩展

本文分2部分 第一为自定义多项目模板 第二为vs add-in开发 文章所有vs版本为2010 效果图 1.自定义模板 2. 工具菜单 3.窗口 4.工程 5.文件 ... 一. 多项目模板 单项目模板做起来很简单 选中一个项目在文件一栏中选中导出模板 然后选择项目模板 在最后一项向导会给出你的输出路径,一般都是系统的用户文档路径+\Visual Studio 2010\My Exported Templates 在对应目录下会生成你对应的项目模板压缩包 我们生成2个项目的模板文件 然后做一个多

3年工作经验程序员应有的技能

每个程序员.或者说每个工作者都应该有自己的职业规划,如果看到这里的朋友没有自己的职业规划,希望你可以思考一下自己的将来... 因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结,因此有了这篇文章.这篇文章大部分内容都是面向整个程序员群体的,当然因为LZ本身是做Java开发的,因此有一部分内容也是专门面向咱们Java程序员的. 简单先说一下,LZ坐标杭州,13届本科毕业,算上年前在阿里巴巴B2B事业部的面试,成都web前端培训一共有面试了有6家公司(因为LZ不想请假,因此只是每个晚上去其他

工作了3年的JAVA程序员应该具备什么技能?(zhuan)

http://www.500d.me/article/5441.html **************************************** 来源:五百丁 作者:LZ2016-03-18 因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结,因此有了这篇文章.这篇文章大部分内容都是面向整个程序员群体的,当然因为LZ本身是做Java开发的,因此有一部分内容也是专门面向咱们Java程序员的. 简单先说一下,LZ坐标杭州,13届本科毕业,算上年前在阿里巴巴B2B事业部的面试,一共有

有2-3年经验的java程序员需要掌握的东西有哪些?

前言 因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结,因此有了这篇文章.这篇文章大部分内容都是面向整个程序员群体的,当然因为LZ本身是做Java开发的,因此有一部分内容也是专门面向咱们Java程序员的. 简单先说一下,LZ坐标杭州,13届本科毕业,算上年前在阿里巴巴B2B事业部的面试,一共有面试了有6家公司(因为LZ不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少),其中成功的有4家,另外两家失败的原因在于: 1.阿里巴巴B2B事业部的面试,两轮技术面试都过了,最后一轮

(面试感悟)一名3年工作经验的程序员应该具备的技能

前言 因为和同事有约定再加上LZ自己也喜欢做完一件事之后进行总结,因此有了这篇文章.这篇文章大部分内容都是面向整个程序员群体的,当然因为LZ本身是做java开发的,因此有一部分内容也是专门面向咱们java程序员的. 简单先说一下,LZ坐标杭州,13届本科毕业,算上年前在阿里巴巴B2B事业部的面试,一共有面试了有6家公司(因为LZ不想请假,因此只是每个晚上去其他公司面试,所以面试的公司比较少),其中成功的有4家,另外两家失败的原因在于: 1.阿里巴巴B2B事业部的面试,两轮技术面试都过了,最后一轮