Pregunta

Mi proyecto actual mascota es una biblioteca de migración de base independiente del lenguaje ( Wizardby en google Code). Es más o menos inspirado en ActiveRecord migraciones, pero tiene algunas sutilezas. Por ejemplo, hace un poco de "inferencia de tipos" básicos por lo que no tiene que especificar el tipo de una columna FK. También es lo suficientemente inteligente como para generar secuencias de comandos "degradar" dados solamente "actualizar" secuencia. A pesar de que las migraciones se escriben en un DSL especial, esta herramienta está dirigido principalmente a proyectos de .NET. Es también la base de datos-independiente de la plataforma.

He aquí un vistazo rápido de la sintaxis:

  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

Soy consciente de otras bibliotecas de migración por ahí, pero bueno, es un proyecto de mascotas!

La pregunta es: ¿qué características Qué espera de kits de herramientas de migración de base de datos en general y lo que se puede decir de esta sintaxis en cuanto al cachorro en particular?

¿Fue útil?

Solución

Desde el aspecto de que tengo que decir que es poco profunda fácil de seguir y en general la estructura se ve bastante limpio.

Las características más grandes que yo estoy buscando en algo como esto son los siguientes.

  1. Posibilidad de realizar cambios en una transacción para hacer retroceder deberían no ser un problema. (Integridad de los datos o de otra manera)
  2. Capacidad de ver los scripts SQL generados reales en caso de necesidad
  3. reversión automática, si se produce un fallo a la última versión

Tengo otros requisitos relacionados con el movimiento de las claves, índices, y el tipo, pero parece que haya que ya se maneja. Para mí está muy concentrado en los controles en torno a la ejecución real, y un plan de reversión rápida, sólida!

Otros consejos

Me gusta esta sintaxis. En la muestra que se centró en el cambio de estructura. Pero ¿qué pasa con la manipulación de datos?

Es muy a menudo cuando en la migración tengo que modificar los datos (por ejemplo, añadir algunos datos de diccionario).

Me gustaría ver la posibilidad de verificar que cada revisión se ha aplicado a una base de datos. Por lo que dicen, por ejemplo, la versión 3 añade el cuadro 'Medios'. Desde entonces las versiones 4 y 5 se han añadido a la base de datos pero en algún lugar a lo largo de la línea 'Johnny Q Experto' borrado la tabla 'Medios'. Ahora viene la versión 6, que necesita para alterar la tabla 'Medios' (que ya no existe) - una función de verificación podría ser útil que garantiza la culminación de todos los cambios realizados en las versiones 1 thru 5 de ellas presentes en la base de datos para la próxima versión puede ser se aplica correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top