run remove rails migrations data column ruby-on-rails migration production

ruby on rails - remove - Rieles: la mejor forma de realizar cambios en una base de datos de producción



rollback migration rails (4)

Necesito hacer cambios en una base de datos de producción en uso. Solo agregando algunas columnas. Realicé los cambios en la base de datos de desarrollo con migraciones. ¿Cuál es la mejor manera de actualizar la base de datos de producción mientras se preservan los datos existentes y no se interrumpe demasiado la operación?

Es MYSQL y necesitaré agregar datos a las columnas también para los registros ya existentes. Una columna puede tener un valor predeterminado (es booleana) pero la otra es una marca de tiempo y debe tener un valor arbitrario retroactivo. Los recuentos de filas no son enormes.

Entonces, si uso migraciones, ¿cómo agrego datos y cómo obtengo los dos (o tres)? Agrego datos -las migraciones más recientes en el archivo db de producción cuando no se creó inicialmente mediante migraciones (creo que usaron el esquema en su lugar)?


¿Hay algún motivo por el que no esté utilizando las mismas migraciones que utilizó en su entorno de desarrollo?


Agregar una columna con add_column en una migración no debe ser destructivo: generará una declaración "ALTER TABLE". Si sabe lo que va a poner en las columnas una vez creadas, puede completar los valores dentro de la migración (puede elegir una alternativa que consuma menos tiempo si el recuento de filas es grande).

La eliminación o alteración de la definición de una columna es, creo, dependiente de la plataforma: algunos permitirán la eliminación de una columna en su lugar, otros realizarán una secuencia de comandos de renombrar-crear-seleccionar-soltar.

Para ser más específico, necesitamos más información: qué tipo de migración está mirando, en qué plataforma se está ejecutando, ¿necesita establecer valores como parte de la migración? Este tipo de cosas ayudaría mucho; solo edite la pregunta, lo que hará que vuelva a subir la lista.


Yo siempre sigo este procedimiento:

  • Dump prod base de datos con el comando mysqldump
  • Rellene la base de datos de desarrollo / prueba con volcado utilizando el comando mysql
  • Ejecutar migraciones en dev / test
  • Verifica migración trabajada
  • Dump prod base de datos con el comando mysqldump (como puede haber cambiado) manteniendo la copia de seguridad en el servidor
  • Ejecute migraciones en prod (usando capristano)
  • La migración de prueba ha funcionado en prod
  • Beber cerveza (mientras mira los registros de errores)

Parece que estás en un estado en el que el esquema db de producción no coincide exactamente con lo que estás utilizando en el desarrollo (aunque no está del todo claro). Trazaría una línea en la arena y conseguiría que el prod db estuviera en mejor estado. Esencialmente, lo que quiere hacer es asegurarse de que el prod db tenga una tabla "schema_info" que enumere las migraciones que nunca desea ejecutar en producción. Luego puede agregar migraciones al contenido de su corazón y funcionarán en contra de la producción db.

Una vez hecho esto, puede escribir migraciones que agreguen cambios de esquema o agreguen datos, pero una cosa de la que debe tener mucho cuidado es que si agrega datos usando una migración, debe definir el modelo dentro de la migración en sí, como este :

class AddSomeColumnsToUserTable < ActiveRecord::Migration class User < ActiveRecord::Base; end def self.up add_column :users, :super_cool, :boolean, :default => :false u = User.find_by_login(''cameron'') u.super_cool = true u.save end def self.down remove_column :users, :super_cool end end

La razón de esto es que en el futuro, puede eliminar el modelo por completo, durante alguna refactorización u otra. Si no define la clase de usuario en la línea "User.find_by_login ..." la migración arrojará una excepción que es un gran problema.