databases - database versioning
¿Cómo puedo obtener mi base de datos bajo control de versión con Perl? (6)
He estado buscando las opciones para hacer que nuestros esquemas de base de datos estén bajo control de versiones. Parece que los amigos de Ruby tienen Rails Migrations , y los de .NET tienen algunas opciones (por ejemplo esto , esto y esto ). ¿Qué hay de Perl?
He visto este hilo en PerlMonks que no tiene mucho, aunque menciona DBIX :: Migration :: Directories . ¿Alguien realmente está usando este módulo, o algún otro módulo? ¿O lanzas tus propias soluciones de migración de bases de datos?
Detalles Gratuitos:
- No usamos DBIx :: Class en su mayor parte
- Usamos MySQL
- Usamos SVN
En POPFile usamos nuestra propia solución. Almacenamos un número de versión de esquema en el db y si el programa detecta que hay un esquema más nuevo, actualizará el db en consecuencia. Esta no es exactamente la mejor y más divertida parte de nuestro código.
Para ser sincero, no veo la ventaja de utilizar DBIx :: Migration :: Directories si aún no está utilizando DBIx :: Class. Debe proporcionar el SQL y los números de versión y el manejador de la base de datos. También podría proporcionar un poco más de código para encontrar el archivo sql y alimentarlo a la base de datos.
Por supuesto, tener el esquema en control de versión es una gran ventaja.
Un proyecto muy interesante que probablemente aún sea un poco joven en el que confiar es ORLite :: Migrate de Adam Kennedy, que se inspira en las migraciones de Rails. Él escribió un diario muy interesante en use.perl.org sobre sus planes y espero vigilarlo para el futuro.
Parece que este paquete solo funciona con SQLite en este momento, pero creo que Adam planea construir esto para ser más agnóstico en la base de datos en el futuro.
Usamos un sistema similar al descrito por Manni. Las dos grandes desventajas son:
No se pueden revertir los cambios de esquema (generalmente esto es raro, no está bien probado y es difícil de todos modos, por lo que tener que hacerlo manualmente no es un gran problema).
Usar un número de versión secuencial es un problema cuando se desarrolla en múltiples ramas, ya que está usando SVN, no es probable que sea un problema como si estuviera usando git. :-)
El script script que uso está aquí: database_update y hay un pequeño archivo de datos de ejemplo .
¿Qué hay de sqitch ? Se anuncia como una "aplicación de gestión de cambio de base de datos",
Hay un módulo de CPAN interesante ( Database :: Migrator ). Lo he usado y funciona bien para manejar las migraciones de su proyecto.
Cada migración entra en su propio directorio. Las migraciones se aplican en orden ordenado, normalmente las nombra comenzando con un prefijo numérico. El directorio de migración puede contener archivos con SQL o Perl.
En el trabajo, usamos una versión modificada de DBIx :: Migration (tiene algunas limitaciones, como no más de 10 migraciones). Luego, tiene un esquema central que ha descartado de su base de datos y, cuando el número de versión es muy bajo, actualiza su base de datos utilizando las migraciones del directorio de esquema de migración.
También recomiendo encarecidamente el libro Refactoring de la base de datos . Entre otras cosas, le brindará excelentes técnicas para administrar migraciones de forma segura , de modo que si necesita retroceder, no pierde datos (como cuando suelta una columna que cree que no necesita).
Para ayudar con los cronogramas de desaprobación automáticos que sugiere, escribí Devel :: Deprecate para que no tenga que recordar cuándo hacer las desaprobaciones. Su código se quejará en voz alta por usted (y solo en las pruebas, no en la producción).
Importante : Periódicamente descubrirá que está aplicando tantos niveles de migración de base de datos con esta técnica que a veces necesitará "incrementar" su migración base mínima porque lleva demasiado tiempo reconstruir la base de datos. Simplemente tome un nuevo volcado de la base de datos en el nivel de migración deseado y elimine todas las migraciones inferiores o iguales a ese nivel.
Actualización : Avance rápido unos años y hoy recomiendo sqitch . Está diseñado desde cero para manejar el caso de poner una base de datos bajo control de versiones sin vincularlo a un lenguaje de programación particular o VCS.