2008-09-16 20 views
5

experimentado con rieles/ActiveRecord 2.1.1rake db: migrate no detecta nueva migración?

  • Se crea una primera versión con (por ejemplo) ruby ​​script \ generar título del producto del andamio: Descripción de la cadena: el texto image_url: cadena
  • Esta crear (por ejemplo) un archivo de migración llama 20080910122415_create_products.rb
  • se aplica la migración con rake db: migrate
  • Ahora, agrega un campo a la tabla de productos con ruby ​​script \ generar la migración precio add_price_to_product: decimal
  • Este cree un archivo de migración llamado 20080910125745_add_price_to_product.rb
  • Si intenta ejecutar rake db: migrate, en realidad revertirá la primera migración, ¡no aplicará la siguiente! ¡Entonces su tabla de productos será destruida!
  • Pero si ejecutó el rastrillo solo, habría dicho que una migración estaba pendiente

nota de Pls que la aplicación de rake db: migrate (una vez que la mesa ha sido destruida) se aplicará todas las migraciones en orden.

La única solución que he encontrado es para especificar la versión de la nueva migración como en:

rake db:migrate version=20080910125745 

Así que me pregunto: ¿se trata de un nuevo comportamiento esperado?

Respuesta

1

Usted debe ser capaz de utilizar

rake db:migrate:up 

a la fuerza para seguir adelante, pero entonces corre el riesgo de migraciones intercalados que faltan de otras personas de su equipo

si ejecuta

rake db:migrate 

dos veces, volverá a aplicar todas sus migraciones.

Encuentro el mismo comportamiento en Windows con SQLite, podría ser un error específico de dicho entorno.

Editar - He encontrado el motivo. En la base de datos railstie.tarea rake que tiene el siguiente código:

desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false." 
task :migrate => :environment do 
    ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true 
    ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil) 
    Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby 
end 

Luego, en mis variables de entorno Tengo

echo %Version% #=> V3.5.0f 

en Ruby

ENV["VERSION"] # => V3.5.0f 
ENV["VERSION"].to_i #=>0 not nil ! 

por lo tanto la tarea rake llamadas

ActiveRecord::Migrator.migrate("db/migrate/", 0) 

y en Activo Registro :: Migrator tenemos:

class Migrator#:nodoc: 
    class << self 
    def migrate(migrations_path, target_version = nil) 
     case 
     when target_version.nil?    then up(migrations_path, target_version) 
     when current_version > target_version then down(migrations_path, target_version) 
     else          up(migrations_path, target_version) 
     end 
    end 

Sí, rake db:migrate VERSION=0 es la versión larga para rake db:migrate:down

Editar - Me gustaría ir actualizar el fallo del faro pero el proxy súper empresa prohíbe que conecto no

Mientras tanto, puede intentar desactivar la versión antes de llamar a migrar ...

0

Este no es el comportamiento esperado. Iba a sugerir informar esto como un error en el faro, pero veo que tienes already done so! Si proporciona algo más de información (incluida la versión de SO/base de datos/ruby) lo echaré un vistazo.

1

Estoy respetuosamente en desacuerdo Tom! este es un error !! V3.5.0f no es una versión válida para migraciones de rake. Rake no debería usarlo para migrar: simplemente porque ruby ​​eligió considerar que "V3.5.0f" .to_i es 0 ...

Rake debería quejarse en voz alta de que VERSION no es válida para que los usuarios sepan qué ocurre (entre usted y yo, verificando que la versión es una marca de tiempo con formato YYYYMMDD convirtiendo a entero es un poco claro)

[¡Maldita IE6 que no me permite comentar! y no, yo no puedo cambiar navegador gracias corporativos]

0

Jean,

Gracias mucho por su investigación. Tienes razón, y en realidad creo que has descubierto un error más grave, el error de diseño de la especie.

Lo que está sucediendo es que el rake capturará cualquier valor que pase a la línea de comando y lo almacenará como variables de entorno. Las tareas de rake que finalmente recibirán llamadas extraerán estos valores de la variable de entorno. Cuando db: migrar consultas ENV ["VERSIÓN"], en realidad solicita el parámetro de versión que ha establecido llamar al rake. Cuando llama a rake db: migrate, no pasa ninguna versión.

Pero sí tenemos una variable de entorno llamada VERSIÓN que ha sido configurada para otros fines por algún otro programa (aún no lo sé). Y los chicos detrás de Rake (o detrás de database.rake) no han pensado que esto sucedería. Eso es un error de diseño. Al menos, podrían haber usado nombres de variables más específicos como "RAKE_VERSION" o "RAKE_PARAM_VERSION" en lugar de solo "VERSIÓN".

Tom, definitivamente no cierro, pero edito el informe de error en el faro para reflejar estos nuevos hallazgos.

Y gracias de nuevo Jean por su ayuda.¡He publicado este error en faro como 5 días atrás y todavía no recibí respuesta!

Rollo

Cuestiones relacionadas