2009-05-08 14 views
16

Ejecuto "rake db: migrate" para volver a sincronizar schema.db con mi esquema de base de datos. Pero falló, diciendo que una de mis tablas ya existe. Creo que estaba intentando recrear la mesa. Si solo quiere que schema.rb se actualice para reflejar cualquier cambio que haya realizado en la base de datos independientemente de Rails, ¿qué comando debería usar si no fuera "rake db: migrate"? ¿Y cuál es la mejor fuente de documentación sobre este tipo de cosas?¿Está rake db: migra el comando correcto para volver a sincronizar schema.rb con su esquema de base de datos?

+1

Pruebe ** 'rake db: schema: dump' ** y luego dele a su editor unos instantes para que recoja los cambios del archivo. –

Respuesta

17

"rake db: migrate" intentará ejecutar todas las migraciones pendientes para su proyecto. Si solo desea volcar el esquema, haga un "rake db: schema: dump".
Pero creo que tienes un problema donde dice que la tabla ya existe. Una de sus migraciones está fallando porque la tabla que intenta agregar ya existe en su db. ¿Creaste uno a mano? ¿Has bajado una migración, pero no tienes un down escrito para eso? Deberá corregir esto antes de poder escribir futuras migraciones. Si solo es un error, y la tabla está allí y es correcta, y desea ignorar esto. Mi recomendación es hackearlo comentando la tabla de creación en la migración anómala. Luego ejecute "rake db: migrate". Entonces, pero la tabla de creación vuelve. Esto actualizará su versión de esquema.
Asegúrese de escribir errores adecuados en todas las migraciones.

+0

Buena explicación. Gracias. – drizzle

2

Pruebe rake db:schema:dump o rake db:migrate:redo.

14

he encontrado que de vez en cuando, cuando las cosas se ponen un poco raras, te encontrarás en una situación en la que Rails querrá ejecutar una migración que debería considerar correctamente (la tabla ya existe, etc.). Puede marcar una migración como se hace mediante la búsqueda de su número (el número de pieza al comienzo del nombre de archivo), entrando en mysql y emite una consulta de este modo:

insert into schema_migrations values('20090521153438'); 

(o cualquiera que sea el número de su migración es)

O si es un ser plug-in de ejecución mediante la migración migrate_plugin del Desierto:

insert into plugin_schema_migrations values('my_plugin', '005'); 
+0

Gracias por el consejo. – Espen

+1

¡Buena pena, gracias por esto! Esta es la ÚNICA solución que he visto que ** no borra todos tus datos **. Use esto si tiene datos en tablas que no desea eliminar :) – FireDragon

+1

otra, si hacky, la táctica es comentar el cuerpo de la migración ofensiva y luego migrar. – hoff2

17

Trate

RAILS_ENV=development rake db:drop 

antes

RAILS_ENV=development rake db:migrate 

y sé feliz!

Asegurarse de que se ejecuta en el entorno de prueba o desarrollo ya que esta se reducirá la base de datos/tablas

+0

Esto funcionó para mí: rake db: drop –

+3

rake db: drop drops all your tables, por lo que el siguiente rake db: migrate comenzará desde cero y aplicará todas las migraciones – timkay

+8

quizás sea lo mismo que 'rake db: migrate: reset' ? – lulalala

6

rake db:migrate:reset caerá todas las tablas, ejecutar todas las migraciones y crear un nuevo archivo schema.rb.

2

Use rake db:schema:dump.

$ rake -T | grep schema 
rake db:schema:dump # Create a db/schema.rb file that is portable 
        # against any database supported by ActiveRecord 

rake db:schema:dump vuelve a crear el archivo db/schema.rb sin ejecutar ninguna de sus migraciones de nuevo, o dejar caer las tablas (que implica la pérdida de los datos en las tablas), por lo que es la forma menos invasiva se puede tratar en primer lugar.

Cuestiones relacionadas