2011-08-10 24 views
14

que soy un idiota ... la pata de una migración en rieles:Rieles: la forma de revertir una migración fallida

migraciones de pensamiento funcionarían como generadores modelo (utilizando references:modelname) hice lo siguiente:

$ rails g migration add_event_to_photos references:event 

que creó la migración

class AddEventToPhotos < ActiveRecord::Migration 
    def change 
    add_column :photos, :references, :event 
    end 
end 

Y ahora mi base de datos de desarrollo (SQLite3) tiene un references columna del tipo event en la tabla photos.

Y mi schema.rb tiene una línea en el medio diciendo:

# Could not dump table "photos" because of following StandardError 
# Unknown type 'event' for column 'references' 

rake db:rollback es impotente frente a esto:

$ rake db:rollback 
== AddEventToPhotos: reverting =============================================== 
-- remove_column("photos", :references) 
rake aborted! 
An error has occurred, this and all later migrations canceled: 

undefined method `to_sym' for nil:NilClass 

Por lo tanto, la forma de hacer retroceder y mantener los datos de mi desarrollo en el ¿base de datos? Incluso me encantaría destrozar la mesa de fotos si esa es mi única opción ... pero no quiero tener que reconstruir todo. ¿Qué hacer?


btw- para cualquiera que esté leyendo esto para cometer el mismo error estúpido ... ¡no! Utilice el generador de la migración correcta:

$ rails g migration add_event_to_photos event_id:integer 

Respuesta

2

agregar un vacío hacia abajo método y ejecutar rake db: deshacer

edición Ahh esa es la nueva sintaxis de la migración, se puede reemplazar el cuerpo con simplemente:

def self.down; end 

que es la sintaxis anterior, o tal vez eliminar el cuerpo por completo (no lo han probado) y luego ejecutar rake db:rollback

+0

Esto parece mover el contador de reversión * (o lo que sea que realice un seguimiento de las migraciones) * de nuevo, pero mantiene la columna de 'referencias' de tipo' evento' en la base de datos que impide que 'schema.rb' se actualice porque' No se pudo volcar la tabla "fotos" ... ' – Meltemi

+0

ah, esto es más complicado de lo que me di cuenta. ¿Puedes simplemente eliminar las líneas de schema.rb ahora que el número de esquema se ha revertido? – numbers1311407

+0

sí. pero entonces, que yo sepa, no puedo 'rakear db: schema: load' porque el esquema está fuera de sintonía ... – Meltemi

3

Ir a la base de datos por ./script/rails dbconsole. A continuación, escriba los siguientes comandos:

.output dump.sql 
.dump 

En el archivo dump.sql tendrá los comandos SQL que se utilizan para volver a crear y poblar su base de datos. Simplemente edítelo con su editor favorito (como vim ;-) quitando o arreglando el tipo de columna. También puede eliminar el identificador de migración no válido de la tabla schema_migrations. Suelta tu base de datos (sugiero simplemente renombrar el archivo db/development.sqlite), crea una nueva base de datos y lee el archivo de volcado en ella (usando el comando .read dump.sql).

Ahora solo necesita corregir y ejecutar sus migraciones.

0

Solo una idea, sé que no es SQLite específico, puede volver a un esquema de versión anterior, quizás, cargarlo. ¿Y volver a intentarlo desde allí? Puede revertir (verificar) archivos específicos en GIT. Y luego haga def self.down; end, como fue sugerido por otro afiche.

0

El problema surge porque mientras SQLite creará el esquema con el tipo que le dé (en este caso event no puede volcar ese tipo a ActiveRecord).

Necesita editar el archivo sqlite_master y cambiar la cadena create table (sql) para que sea lo correcto.

Es probable que desee hacer una copia de seguridad de su tabla primero, ya que estropear esa cadena arruinará su tabla si lo hace mal.

Here is a related rails issue

6

La manera más fácil que he encontrado para hacer esto era recrear la tabla en el archivo schema.rb en /db/. Después ejecuté rake db:reset (si dice que tiene migraciones pendientes, simplemente elimínelas y vuelva a intentarlo).

Esto se encargó del problema.

Cuestiones relacionadas