【强烈推荐】数据库迁移利器:Migrator.Net

简介

很郁闷,写了一天的遇到LiveWriter错误,可恶啊

几年前在做项目中第一次接触到了Migrator.Net,就深深被吸引住了,至此以后在新的大项目中,我都会使用Migrator.Net来创建或者更新数据库架构。曾经在项目中也发现了小bug并提交给了作者,当时还是有点小激动啊。几年过去了,Migrator.Net虽然已经迁移到了github上,但作者好像从3年前就不再更新了,不过这不影响我对它的喜爱,一如既往的使用着它,它的出现让我对数据库这块彻底的放开,不用手动去创建表,不用手动的去创建索引,一切就这么简单。

目前Migrator.Net原生代码支持:MsSql,Oracle,PostgreSql,Sqlite,MySql。当然您也可以继承其几个抽象类,完成对其他数据库的支持。使用 Migrator.Net,您可以不用关注使用的是什么类型数据库,数据库之间的迁移也很方便,我们只要关注的是我需要哪些表,哪些字段,哪些索引,哪些关联。

您是否碰到过在项目成熟后,新来的CTO要改变数据库类型,或者重新独立数据库,又或者数据的越来越大,更新更好的数据库呢?这时候作为码农的我们是最头大的时候,因为我可能是在中途接手的项目,也有可能是几年前设计的数据库,鬼知道要做些什么工作啊!为了吃饭,不得不重新研究数据库,不更改数据库类型还好,导出脚本即可,遇到更改数据库类型,天呐~~~有了Migrator.Net,以后您就不需要再有这个担心了,交给他来吧!

准备工作

目前Migrator.Net已经更新至0.9.1版本,您可以通过NuGet管理器下载其相关Dll到您的项目中。最好您也下载其源代码:https://github.com/migratordotnet/Migrator.NET

为了帮助VS2012以前版本的朋友,我打包一下所需的工具及dll,点击下载

下载源代码后,我们看一下他有3个主项目

Migrator.Framework 我们编写数据库结构时所需要用到的框架

Migrator.Providers 提供了对各个数据库的支持

Migrator 这个就是最终运行升级、回滚操作的类库。

准备工作做好,我们来看下如何创建新表

创建新表

我这次还是用上一篇FluentNhibernate中的数据表,直接看代码,很好理解的:

[Migration(1)]
    public class _001_AddTable_Store : Migration
    {
        public override void Down()
        {
            Database.RemoveTable("Store");
        }

        public override void Up()
        {
            Database.AddTable("Store",
                new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity),
                new Column("Name", DbType.String, 100, ColumnProperty.NotNull));
        }
    }

我们所有需要Migrator.Net控制的,都需要继承Migration抽象类,实现Down和Up方法,还需要在类特性中使用MigrationAttribute指定版本号。Migrator.Net在运行时,会根据指定的版本号进行升级或者回滚操作。

Migration.Up:版本升级时所需的操作

Migration.Down:版本回滚时所需的操作

Database.AddTable:创建新表

Column:列表类,通过指定列名、类型、长度、列属性创建新列

ColumnProperty:列属性

[Flags]
    public enum ColumnProperty
    {
        None = 0,
        Null = 1,
        NotNull = 2,
        Identity = 4,
        Unique = 8,
        Indexed = 16,
        Unsigned = 32,
        ForeignKey = 33,
        PrimaryKey = 98,
        PrimaryKeyWithIdentity = 102,
    }

对应的都是数据库中列的一些属性,大家应该可以看懂吧

Database.RemoveTable:删除某个表

Up和Down一般都是一一对应的,增加个表,删除个表,增加约束,删除约束等等。

小贴士:建议大家版本号一定要递增,所以在版本类中,我们可以使用“版本号_操作_表名”来命名文件,比如:001_AddTable_Store.cs

接下来我们再创建一个Employee表:

[Migration(2)]
    public class _002_AddTable_Employee : Migration
    {
        private const string tablename = "Employee";

        public override void Up()
        {
            Database.AddTable(tablename,
                new Column("Id", DbType.Int32, ColumnProperty.PrimaryKeyWithIdentity),
                new Column("LastName", DbType.String, 50, ColumnProperty.NotNull),
                new Column("FirstName", DbType.String,50, ColumnProperty.NotNull),
                new Column("Store_Id", DbType.Int32, ColumnProperty.NotNull));

            Database.AddForeignKey("FK_Employee_Store",
                "Employee", "Store_Id",
                "Store", "Id");
        }

        public override void Down()
        {
            Database.RemoveForeignKey(tablename, "FK_Employee_Store");
            Database.RemoveTable(tablename);
        }
    }

在这个版本中,我们使用了Database.AddForeignKey使Employee表与Store表有了关联。除了之前介绍的AddTable和RemoveTable之外,还有以下常用方法:

ITransformationProvider.AddForeignKey 添加关系

ITransformationProvider.RemoveForeignKey 移除关系

ITransformationProvider.AddCheckConstraint 添加约束

ITransformationProvider.AddUniqueConstraint 添加唯一约束

ITransformationProvider.RemoveConstraint 移除约束

ITransformationProvider.AddPrimaryKey 添加主键

ITransformationProvider.AddColumn 添加列

ITransformationProvider.RemoveColumn 移除列

在删除某个表时,请先清除其约束、关系,否则无法删除。

ok,基本了解后,我们来运行一下

运行

你可以自己写个运行程序,使用Migrator类库中的方法,也可以使用作者已经写好的一个控制台程序进行版本控制。项目所在位置:

使用以下命令运行数据迁移:

Migrator.Console.exe SqlServer2005 "Data Source=.;Initial Catalog=MigratorDemo;Integrated Security=SSPI" DataBaseDemo.dll -version 2

蓝色:数据库类型,对应的是Migrator.Providers.Dialect的子类

红色:数据库连接字符串

橙色:程序集文件名

绿色:版本号,如果忽略将会更新到最新版本,通过-version可以升级和回滚操作。

小贴士:为了项目方便,我把命令写在了bat文件里,方便升级和回滚,您可以点击下载我的工具包

在运行前,我们需要用SqlServer Management Studio连接到数据库,创建一个新的数据库:MigratorDemo

运行以上命令,如果一切顺利,您将看到如下界面:

我们看下Migrator.Net在数据库中创建了什么?

除了我们创建的2个表之外,另外还有一个SchemaInfo表,其中记录了所有的版本信息,请不要手动操作该表。

更新Table

很多时候,我们会不断的更新我们的Table,使其适应我们不断变更的项目。以往我们在更新表格的时候,都会去数据库进行操作,为了我们的应用环境,我们都会写成脚本再去更新,现在有了Migrator.Net我们只需要创建一个升级版本,让它帮我们去更新table,就算遇到错误,因为使用了事务控制,在升级中出现问题也会及时回滚。

接下来我们为Employee表格添加年龄字段:

[Migration(3)]
    public class _003_AddColumn_Employee : Migration
    {
        private const string tablename = "Employee";

        public override void Up()
        {
            Database.AddColumn(tablename,
                new Column("Age", DbType.Byte, ColumnProperty.NotNull, ));
        }

        public override void Down()
        {

        }
    }

通过AddColumn添加表,这里注意下,在Down方法中,我并未对应使用RemoveColumn,是因为在项目中,我添加表和添加表字段中间会发生多次数据库操作,在添加字段后,也会对数据库进行多次操作,所以为了数据库数据不遗失,我这里的Down操作没有添加任何动作,这样只当RemoveTable的时候才会删除这个表的所有数据。当然这个也要按照你的实际情况来,不能一概而就的。

红色0是这个字段的默认值,因为有时候添加字段的时候,这个表已经产生数据,而字段又是非可空类型,这时候您必须添加默认值,否则运行会失败。

运行下,我们看下数据库是否相应进行了改变:

我们看到Employee表已经成功添加了Age字段,SchemaInfo表也相应的添加了版本号3

回滚

有时候我们在开发项目时,会经常对数据库进行改动,但改动后又会感觉不好,再去回滚,在以前我们都会去数据库进行操作,现在我们只要用回滚操作就可以了,我们只需要指定需要回滚到的版本号即可,我们试着回滚到version 1

Migrator.Console.exe SqlServer2005 "Data Source=.;Initial Catalog=MigratorDemo;Integrated Security=SSPI" DataBaseDemo.dll –vsersion 1

运行以上命令,然后查看下数据库的改变:

看到了吧,利用Migrator.Net,一切都是如此简单。

有了Migrator.Net是否不需要DBA了?

答案肯定是否定的。Migrator.Net只是方便了我们的数据库迁移工作,并不能代替DBA的工作,DBA还需要进行很多数据库相关的工作,这是Migrator.Net无法代替的。

在项目中,我建议DBA先行设计数据库架构,再通过码农进行代码编写,双方相互合作。

Migrator.Net给我们带来了什么?

给我们带来了什么?这个话题不太好说,至少对于我来说,我不需要关心数据库迁移产生的问题,我只需要关注我的项目开发这块了,利用Migrator.Net再配合ORM工具,我都不用去关心数据库类型不同产生的问题了。

今天给大家带来这个工具,虽说已经是个老工具了,但用起来还是杠杠滴,现在通过Nuget你搜索Migrator会搜出很多,但基本原理都差不多。Migrator.Net也开放了很多接口,我们可以通过自己编写代码让其适应我们的项目,比如数据库表创建后添加一些静态数据等。

大家应该用过一些开源项目,通过web安装方式安装数据库、配置文件等,一般都是运行编写好的Sql语句,有了Migrator.Net,通过其一些接口方法,我们同样可以利用Web方式运行操作。

写在最后

Migrator.Net虽说是个好工具,但是否使用还得看您的项目,如果项目已经开始到一半或者接近尾声,那使用他也未必可以为您带来好处,但如果项目人员流动性比较大的话,还是建议您写一个迁移类库,以免造成新人对适应环境所造成的时间损失。

原本清明前写好的,因为自己的不小心,只得重新来过,呵呵。希望这篇教程能给您带来帮助。

最近看了2则新闻,相信大家都应该知道:

7岁捐肾救母男孩离世 妈妈眼含热泪接受手术

看到这则新闻,真的很痛心,我刚当父亲不久,宝宝的发烧都会时时牵动我的心。这个男孩救母的行为真心打动了我。孩子的妈妈也不容易,真的无法想想这个妈妈在接受手术时是个什么样的心情。希望这个妈妈为她的孩子继续活着!

11岁女孩独自照顾82岁奶奶3个妹妹和2个患病叔伯

小女孩真懂事,这是世界太多的不公平,但她还能笑着面对。我们的红x会,福利机构统统马航,作为一个普通的IT屌丝,希望通过自己的绵薄之力赞助其学业。但是新闻上没有公布任何其信息,所以希望在此通过大家帮我寻找下,目前的信息为:张雪群 泸州市纳溪区合面镇马桥村

如果有小女孩消息的,请直接联系我,QQ:785418

时间: 2024-08-02 07:56:35

【强烈推荐】数据库迁移利器:Migrator.Net的相关文章

XTTS,又一个值得你重视的Oracle数据库迁移升级利器

   嘉宾简介    杨志洪 [DBA+社群]上海发起人 数据管理专家.Oracle ACE.OCM. SHOUG/ZJOUG核心成员.DAMA会员/CCF会员,译著<Oracle核心技术>. 在Oracle OOW.DTCC及2015Oracle数据库技术大会等全国性技术会议上发表主题分享,并主办了2014Oracle全国技术巡讲. 2015年创立DBA+社群迅速成为全中国最大的涵盖数据架构师.DBA及中间件的专业社群.   演讲实录    既然说是又一个数据库迁移.升级的利器,那自然而然的

Oracle数据库上云利器 阿里云发布数据库迁移服务ADAM

为了方便用户更安全快速地在云上开展数据库业务,阿里云在2017云栖大会•上海峰会上推出了业内首个覆盖数据全生命周期的应用与数据库迁移工具Advanced Database & Application Migration(以下简称ADAM),该服务使得企业能够将Oracle等数据库无缝迁移上云,在云上数据库MySQL.PPAS.AnalyticDB等开展业务. 阿里云提供了智能分析工具,可自动化提供迁移建议方案,最大程度简化操作流程,降低迁移成本,实现业务平滑升级.  同时,阿里云还宣布推出面向物

“移山”法宝~阿里数据库迁移项目yugong(愚公)开源啦!【内有详解】

项目简介 yugong(意译:愚公)项目是阿里的开源项目,该项目使用纯Java开发,主要作用是进行数据库迁移,目前该项目主要支持从oracle数据库向Mysql和DRDS数据库进行迁移. 项目背景 08年左右,阿里巴巴开始尝试MySQL的相关研究,并开发了基于MySQL分库分表技术的相关产品,Cobar/TDDL(目前为阿里云DRDS产品),解决了单机Oracle无法满足的扩展性问题,当时也掀起一股去IOE项目的浪潮,愚公这项目因此而诞生,其要解决的目标就是帮助用户完成从Oracle数据迁移到M

DB2跨平台数据库迁移步骤和注意事项

DB2是个有着广泛商业应用的关系数据库软件.作为一个数据库管理员时常面临着数据库系统的迁移工作,这是一个复杂而艰巨的过程.互联网和DB2的帮助文档中有许多关于DB2数据库迁移的介绍,但是对于DB2数据库的跨平台迁移却很少谈及.本文将基于笔者的成功实践,总结一下跨平台数据库迁移的步骤和注意事项. 简介 设想您是一个 DB2 商业数据库系统的管理员.您被给予一项任务,支持业务开发和测试团队对商业系统的持续开发,为他们创建一套独立于产品环境的数据库系统,从而不影响日常的商业运作.由于种种原因,这套开发

用Kettle的一套流程完成对整个数据库迁移

需求: 1.你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle. 2.你是否还在使用kettle重复的画着:表输入-表输出.创建表,而烦恼.  下面为你实现了一套通用的数据库迁移流程.  技术引导: 实现之初,在kettle提供的例子中找到了一个类似的(samples\jobs\process all tables). 通过相关改造,终于达到目标.  实现过程解剖: 整套流程分为:2个job,4个trans. 使用到的Trans插件:表输入.字段选择.复制记录到结果.从结果获取

Laravel 5框架学习之数据库迁移(Migrations)_php实例

database migrations 是laravel最强大的功能之一.数据库迁移可以理解为数据库的版本控制器. 在 database/migrations 目录中包含两个迁移文件,一个建立用户表,一个用于用户密码重置. 在迁移文件中,up 方法用于创建数据表,down方法用于回滚,也就是删除数据表. 执行数据库迁移 复制代码 代码如下: php artisan migrate #输出 Migration table created successfully. Migrated: 2014_1

Entity Framework 5.0系列之Code First数据库迁移

我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Code First如何更新已有的模型呢?今天我们简单介绍一下Entity Framework的数据迁移功能. Entity Framework配置 在开始今天的话题之前先来看一下Entity Framework的配置,因为有很多朋友因为配置文件的问题造成"Migrations"命令执行失败.

[saiku] 将saiku自带的H2嵌入式数据库迁移到本地mysql数据库

saiku数据库的表和用户默认创建是在启动项目的时候,通过初始化 saiku-beans.xml 中的 h2database 这个 bean  执行org.saiku.service.Database类的init方法来初始化数据表和默认用户的.   具体修改如下: 1/修改web.xml 中 数据连接配置信息 将数据库链接修改为本地mysql配置信息: <context-param> <param-name>db.url</param-name> <param-v

无眠之夜01 --数据库迁移

上周五10点钟接到老马通知说赣州旅店管理系统数据库要做迁移,把现有的Dell 2850 Windows Service 2003 迁移到Linux云上面.而且下午15点就要开始做迁移工作,17点必须要完成.接到这个任务整的来说还是比较紧张的.不过还好,系统已经装好了,只需要安装数据库就可以,具体的安装过程会在技术文档中贴出.但是更悲剧的是,我在建表空间的时候,系统会莫名挂死,通过云控制台查看是由于CPU资源耗尽导致,(本来低端云云就不适合做数据库,可是有些人为了方便管理.....无语)..后面实