.NET数据库迁移工具包

时间:2009-02-19 14:00:53

标签: .net database-migration

我目前的宠物项目是一个与语言无关的数据库迁移库(Google Code上的Wizardby)。它几乎受到ActiveRecord Migrations的启发,但有一些细节。例如,做一些基本的“类型推断”,因此您不必指定FK列的类型。只有“升级”序列才能生成“降级”脚本。尽管迁移是使用特殊的DSL编写的,但此工具主要针对.NET项目。它也是独立于数据库平台的。

以下是语法的快速概览:

  migration "Blog" revision => 1:
    type-aliases:
      type-alias N type => String, length => 200, nullable => false, default => ""

    defaults:
      default-primary-key ID type => Int32, nullable => false, identity => true

    version 1:
      add table Author:
        FirstName type => N
        LastName type => N
        EmailAddress type => N, unique => true
        Login type => N, unique => true
        Password type => Binary, length => 64, nullable => true

      add table Tag:
        Name type => N

      add table Blog:
        Name type => N
        Description type => String, nullable => false

      add table BlogPost:
        Title type => N
        Slug type => N
        BlogID references => Blog
        AuthorID references => Author

      add table BlogPostTagJunction primary-key => false:
        BlogPostID references => BlogPost
        TagID references => Tag

    version 2:
      add table BlogPostComment:
        BlogPostID references => BlogPost
        AuthorEmailAddress type => N
        Content type => String, nullable => false

    version 3:
      add table Media:
        TypeID type => Int32
        Name type => N
        MimeType type => N
        Length type => Int32
        BlogPostID nullable => true, references => BlogPost
        BlogPostCommentID nullable => true, references => BlogPostComment

      add table User:
        Login type => String, length => 200, nullable => false
        Password type => Binary, length => 64, nullable => false

        index IX_Login columns => [ID, [Login, desc]], unique => true

    version 4:
        add table Forum:
          Name type => String, length => 200, nullable => false
        add column ModeratorUserID nullable => false, references => User

    version 5:
        remove index IX_Login table => User

    version 6:
        add index IX_Login table => User, columns => [ID, [Login, desc]], unique => true

    version 7:
        BlogAuthorJunction primary-key => false:
            BlogID references => Blog
            AuthorID references => Author

        execute native-sql upgrade-resource => InsertSeedData, downgrade-resource => DeleteSeedData

我知道其他迁移库,但是,嘿,这是一个宠物项目!

问题是:您对数据库迁移工具包的期望是什么?您对这种特定的小狗语法有什么看法?

3 个答案:

答案 0 :(得分:6)

我喜欢这种语法。在您的示例中,您专注于改变结构。但是数据操作呢?

在迁移时我经常需要修改数据(例如添加一些字典数据)。

答案 1 :(得分:3)

我希望能够验证每个修订版是否已应用于数据库。所以说例如版本3添加了表'Media'。从那以后版本4& 5已被添加到数据库中,但在“Johnny Q Expert”行的某处删除了“媒体”表。现在版本6需要更改“媒体”表(不再存在) - 验证功能可能很有用,可确保数据库中存在版本1到5中所做的所有更改的高潮,以便下一个版本可以正确应用。

答案 2 :(得分:2)

从它的外观来看,我不得不说这很容易理解,整体结构看起来很干净。

我正在寻找的最大功能如下:

  1. 如果出现问题,可以在事务中进行更改以进行回滚。 (数据完整性或其他方式)
  2. 能够在需要时查看实际生成的SQL脚本
  3. 如果上一版本发生故障,则自动回滚
  4. 我对移动键,索引等有其他要求,但看起来你已经处理好了。对我而言,它真正专注于实际执行的控制,以及快速,可靠的退出计划!