Question

Mon projet animal actuel est une bibliothèque de migration de base de données indépendante de la langue ( Wizardby sur Google code). Il est à peu près inspiré par ActiveRecord migrations, mais a quelques raffinements. Par exemple, le fait une « inférence de type » de base de sorte que vous ne devez pas spécifier le type d'une colonne FK. Il est également assez intelligent pour générer des séquences « downgrade » scripts donnés uniquement « mise à niveau ». Bien que les migrations sont écrites dans un DSL spécial, cet outil est principalement destiné aux projets .NET. Il est également la base de données-plate-forme indépendante.

Voici un aperçu rapide de la syntaxe:

  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

Je suis au courant des autres bibliothèques de migration là-bas, mais bon, c'est un projet animal de compagnie!

La question est: quelles sont les caractéristiques que vous attendez de boîtes à outils de migration de base de données en général et que pouvez-vous dire au sujet de cette syntaxe sage chiot particulier?

Était-ce utile?

La solution

De l'apparence de celui-ci, je dois dire qu'il est farily facile à suivre et dans l'ensemble de la structure semble assez propre.

Les plus grandes caractéristiques que je suis à la recherche quelque chose comme ce sont les suivantes.

  1. Possibilité de faire des changements dans une transaction pour faire reculer le devrait y avoir un problème. (Intégrité des données ou autre)
  2. Possibilité de voir les scripts SQL générés réels en cas de besoin
  3. rollback automatique, si une défaillance se produit à la dernière version

J'ai d'autres exigences en ce qui concerne le déplacement des clés, des index, et tel, mais il semble que vous avez déjà traité. Pour moi, il est vraiment concentré sur les contrôles autour de l'exécution proprement dite, et un plan de backout rapide, solide!

Autres conseils

J'aime cette syntaxe. Dans votre exemple, vous concentré sur la structure en pleine évolution. Mais qu'en est-manipulation de données?

Il est très souvent quand la migration je dois modifier les données (par exemple ajouter des données du dictionnaire).

Je voudrais voir la capacité de vérifier que chaque révision a été appliquée à une base de données. Donc, disons par exemple la version 3 ajoute la table « médias ». Depuis lors, les versions 4 et 5 ont été ajoutés à la base de données, mais quelque part le long de la ligne de Johnny Q Expert 'supprimé la table « médias ». Voici maintenant la version 6 qui doit modifier la table « médias » (qui n'existe plus) - une fonction vérification pourrait être utile qui assure l'aboutissement de toutes les modifications apportées dans les versions 1 à 5 sont présentes dans la base de données pour la prochaine version peut être appliquée correctement.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top