Ver http://edgeguides.rubyonrails.org/active_record_migrations.html#schema-dumping-and-you
migraciones son no una representación de la base de datos: o bien structure.sql o schema.rb es. Las migraciones también son , no, un buen lugar para configurar/inicializar datos. db/seeds
o una tarea de rake son mejores para ese tipo de tarea.
¿Qué son las migraciones? En mi opinión, son instrucciones sobre cómo cambiar el esquema de la base de datos, ya sea hacia adelante o hacia atrás (mediante una reversión). A menos que exista un problema, deben ejecutarse solo en los siguientes casos:
- En mi máquina de desarrollo local como una forma de probar la migración y escribir el archivo de esquema/estructura.
- En máquinas de desarrollador colega como una forma de cambiar el esquema sin soltar la base de datos.
- En las máquinas de producción como una forma de cambiar el esquema sin soltar la base de datos.
Una vez que se ejecutan, debería ser irrelevante. Por supuesto, los errores suceden, por lo que definitivamente desea mantener las migraciones durante unos meses en caso de que necesite deshacerse.
entornos de CI no siempre necesidad de ejecutar migraciones. Disminuye la velocidad de su entorno de CI y es propenso a errores (como dice la guía Rails). Dado que sus entornos de prueba solo tienen datos efímeros, en su lugar debe usar rake db:setup
, que se cargará desde schema.rb/structure.sql e ignorará por completo sus archivos de migración.
Si está utilizando control de código fuente, no hay ningún beneficio en el mantenimiento de las migraciones antiguas alrededor; son parte del historial de fuentes. Puede que tenga sentido ponerlos en una carpeta de archivo si esa es tu taza de café.
Con que todos Dicho esto, creo firmemente que tiene sentido para purgar las migraciones antiguas, por las siguientes razones:
- Podrían contienen código que es tan viejo que ya no se ejecutará (como si ha quitado un modelo). Esto crea una trampa para otros desarrolladores que quieran ejecutar
rake db:migrate
.
- Ellos se ralentizará
grep
tareas -como son irrelevantes y más allá de una cierta edad.
¿Por qué son irrelevantes? Una vez más por dos razones: el historial se almacena en el control de origen y la estructura de la base de datos real se almacena en structure.sql/schema.rb. Mi regla de oro es que las migraciones de más de 12 meses son completamente irrelevantes. Los elimino Si hubiera alguna razón por la que quería deshacer una migración anterior a esa, estoy seguro de que la base de datos ha cambiado lo suficiente en ese momento como para justificar la escritura de una nueva migración para realizar esa tarea.
Así cómo te deshaces de las migraciones? Estos son los pasos que sigo:
- eliminar los archivos de migración
- Escribe una tarea rastrillo para eliminar sus filas correspondientes de la tabla schema_migrations de su base de datos.
- Ejecute
rake db:migrate
para regenerar structure.sql/schema.rb. líneas
- Validar que lo único que cambió en structure.sql/schema.rb se elimina correspondientes a cada una de las migraciones ha eliminado.
- Despliegue, luego ejecute la tarea de rake desde el paso 2 en producción.
- Asegúrese de que otros desarrolladores ejecuten la tarea de rake desde el paso 2 en sus máquinas.
El segundo elemento es necesario para mantener el esquema/estructura precisa, que, una vez más, es lo único que realmente importa aquí.
Intenté escribir migraciones sin referencias de modelo durante un tiempo y resultó ser un gran dolor de cabeza, especialmente si estaba intentando agregar nuevas restricciones a la base de datos. Tendría que escribir una tarea de rake para primero limpiar los datos, y luego insertar una migración para agregar la restricción, porque no se puede ejecutar una tarea de rake cuando hay migraciones que no se han ejecutado. Es mucho más fácil simplemente ponerlo todo en la migración. La bonificación adicional es implícitamente transaccional, por lo que las fallas se revierten. – lobati
@lobati: No encuentro la conexión entre el uso de sus modelos en sus migraciones y las nuevas limitaciones de la base de datos. Utilizo FK, CHECK, triggers, ... reales en todas partes y los administro usando SQL en migraciones, no se necesitan modelos en mis migraciones. –
@muistooshort Me parece agradable poder confiar en las validaciones de nivel de modelo y las conveniencias de consulta al agregar restricciones o mover datos. Por ejemplo, cuando agregamos una restricción FK, a veces encontramos que falta el registro asociado, por lo que es posible que deseemos reconstituirlo de forma condicional o simplemente destruirlo. Gran parte de esto probablemente se pueda manejar con SQL sin procesar, pero también me parece agradable tener la capa extra de abstracción en caso de que sea una consulta de dedo gordo. – lobati