代码版本管理基本上程序员们都知道 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操作,例如更新列,添加数据,更改表名称等等。下面我们简单来试验一下。

         /// <summary>
///添加列
/// </summary>
[Migration()]
public class AlertUser : Migration
{
public override void Up()
{
Alter.Table("Users")
.AddColumn("Age")
.AsInt16()
.Nullable();
} public override void Down()
{
Delete.Column("Age").FromTable("Users");
}
} /// <summary>
/// 添加行数据
/// </summary>
[Migration()]
public class AddDeptRows : Migration
{
public override void Up()
{
Insert.IntoTable("Dept").Row(new { DeptName = "maoyatest" });
} public override void Down()
{
Delete.FromTable("Dept").Row(new { DeptName = "maoyatest" });
}
} /// <summary>
/// 修改表名称
/// </summary>
[Migration()]
public class RenameUsers : Migration
{
public override void Up()
{
Rename.Table("Users").To("UsersNew");
} public override void Down()
{
Rename.Table("UsersNew").To("Users");
}
}

看运行结果

重新加载

版本信息也正确

结果也是完全正确。


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

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

  1. 读《程序员的SQL金典》[1]--基础数据检索

    前言 <程序员的SQL金典>这本书是杨中科老师的,拜读了一下,简单做了读书笔记供以后翻阅.仅供学习分享,要想细读的话推荐购买原版呀! 这次读书的时候用了新的办法把看书计划进行了量化,虽然简 ...

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

    最近2个月没做什么新项目 完全是对于旧的系统进行性能优化 避免超时 死锁 数据处理能力不够等常见的性能问题 这里不从架构方面出发 毕竟动大手脚成本比较高 那么我们以实例为前提 从细节开始 优化角度 一 ...

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

    背景 作为web开发人员大家大多了解一些网站的性能优化方法,其实大部分方法都不复杂,例如针对前端js和css的压缩来减少请求大小,通过合并来减少请求次数.这里站在.Net后端程序员的角度来看一下如何最 ...

  4. 读《程序员的SQL金典》[4]--SQL调优

    一.SQL注入 如果程序中采用sql拼接的方式书写代码,那么很可能存在SQL注入漏洞.避免的方式有两种: 1. 对于用户输入过滤敏感字母: 2. 参数化SQL(推荐). 二.索引 ①索引分类 聚簇索引 ...

  5. 面向.Net程序员的dump分析

    背景 Dump文件是进程的内存镜像.可以把程序的执行状态通过调试器保存到dump文件中.在 Windows 系统上, dump 文件分为内核 dump 和用户态 dump 两种.前者一般用来分析内核相 ...

  6. 读《程序员的SQL金典》[2]--函数

    一.数学函数 1.RAND SELECT RAND () ---0.302870228294199 取0-1之间的随机小数. 2.小数取整 CEILINT(data)舍掉小数部分并向上取整. FLOO ...

  7. 【程序员的SQL金典】笔记(第6章~第11章)

        第六章 索引与约束   1.索引用来提高数据的检索速度,而约束则用来保证数据的完整性.   2.创建索引 创建索引的SQL 语句是CREATE INDEX,其语法如下: CREATE INDE ...

  8. 【程序员的SQL金典】笔记(第1章~第5章)

      第一章数据库入门 1.概念: 数据库 表 列 记录(行) 主键 索引         第二章 数据表的创建和管理 1.数据库系统中的数据类型大致可以分为五类:整数.数值.字符相关.日期时间以及二进 ...

  9. 读《程序员的SQL金典》[3]--表连接、子查询

    一.表连接-JOIN 1. 自连接实例 查询类型相同的订单信息. SELECT O1 .*,O2.* FROM T_Order O1 JOIN T_Order O2 ON O1 .FTypeId= O ...

随机推荐

  1. Robots on a grid(DP+bfs())

    链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=25585 Current Server Time: 2013-08-27 20:42:26 Ro ...

  2. sql把一个表数据插入到另一张表

    把一个表数据插入到另一张表 insert into tableB (field1,field2,field3,field4) select field1,field2,field3,'val4' fr ...

  3. 利用Docker Hub上的Nginx部署Web应用

    Docker Hub上提供了很多镜像,如Nginx,我们不需要自己从ubuntu开始装Nginx再做发布,只需要先下载镜像到本地 docker pull nginx 在/opt下新建文件夹API,将需 ...

  4. [ACM_图论] The Perfect Stall 完美的牛栏(匈牙利算法、最大二分匹配)

    描述 农夫约翰上个星期刚刚建好了他的新牛棚,他使用了最新的挤奶技术.不幸的是,由于工程问题,每个牛栏都不一样.第一个星期,农夫约翰随便地让奶牛们进入牛栏,但是问题很快地显露出来:每头奶牛都只愿意在她们 ...

  5. atitit.ajax 最佳实践跟框架选型 o99

    atitit.ajax 最佳实践跟框架选型 1. 选型框架dwr/dwr3 跟jq 1 2. DWR方便的地方分为两个地方. 1 3. dwr 优点: 1 4. 缺点: 2 5. 根jq的区别 2 1 ...

  6. atitit. 解决org.hibernate.SessionException Session is closed

    atitit. 解决org.hibernate.SessionException Session is closed   #--现象:: org.hibernate.SessionException ...

  7. iOS开发-xCode代码格式化xAlign

    xCode默认是可以进行代码格式化的,能满足基础开发需求,如果想要个性一些代码对齐方式宏对齐,等号对齐,属性对齐,xAlign就提供了以上三种功能,参考文中效果~ 基础效果 等号对齐: 属性对齐: 宏 ...

  8. node.js WebService异常处理(domain)以及利用domain实现request生命周期的全局变量

    成熟的Web Service技术,例如Fast CGI.J2EE.php,必然会对代码异常有足够的保护,好的Web必然会在出错后给出友好的提示,而不是莫名其妙的等待504超时.而node.js这里比较 ...

  9. Liferay7 BPM门户开发之28: Portlet文件上传,及实体类同步更新上传

    抓住核心 . Liferay文件上传的核心就是使用UploadPortletRequest类 继承关系java.lang.Object extended byjavax.servlet.Servlet ...

  10. SpringMVC 架构

    SpringMVC 架构 1. 前言 SpringMVC是目前java世界中最为广泛应用的web框架,最然从学习SpringMVC的第一个程序--helloworld至今,已有好几个年头.其间伴随着项 ...