Инструментарий для миграции базы данных .NET

StackOverflow https://stackoverflow.com/questions/565426

  •  05-09-2019
  •  | 
  •  

Вопрос

Мой текущий любимый проект - это библиотека миграции базы данных, не зависящая от языка (Волшебникби в Google Code).Это в значительной степени вдохновлено миграциями ActiveRecord, но имеет несколько тонкостей.Например, выполняет некоторый базовый "вывод типа", поэтому вам не нужно указывать тип столбца 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

Я знаю о других библиотеках миграции, но, эй, это любимый проект!

Вопрос в том,:какие возможности вы ожидаете от наборов инструментов миграции баз данных в целом и что вы можете сказать об этом конкретном puppy с точки зрения синтаксиса?

Это было полезно?

Решение

Судя по всему, я должен сказать, что следовать ей довольно легко, и в целом структура выглядит довольно чистой.

Самые большие возможности, которые я ищу в чем-то подобном этому, заключаются в следующем.

  1. Возможность вносить изменения в транзакцию для отката в случае возникновения проблемы.(Целостность данных или иным образом)
  2. Возможность видеть фактически сгенерированные SQL-скрипты, если возникнет такая необходимость
  3. Автоматический откат, если происходит сбой, к последней версии

У меня есть другие требования, касающиеся перемещения ключей, индексов и тому подобного, но, похоже, вы с этим уже справились.Для меня это действительно сосредоточено на контроле за фактическим выполнением и быстром и надежном плане возврата!

Другие советы

Мне нравится этот синтаксис.В вашем примере вы сосредоточились на изменении структуры.Но как насчет манипулирования данными?

Очень часто при миграции мне приходится изменять данные (например, добавлять некоторые данные словаря).

Я хотел бы видеть возможность проверки того, что каждая редакция была применена к базе данных.Скажем, например, версия 3 добавила таблицу "Media".С тех пор версии 4 и 5 были добавлены в базу данных, но где-то в строке "Johnny Q Expert" была удалена таблица "Media".Теперь выходит версия 6, в которой необходимо изменить таблицу 'Media' (которая больше не существует) - может быть полезна функция проверки, которая гарантирует, что все изменения, внесенные в версиях с 1 по 5, присутствуют в базе данных, поэтому следующая версия может быть применена правильно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top