2012-03-16 15 views
108

Debido a algunos problemas de implementación detuve el seguimiento de schema.rb en git. De alguna manera lo he rellenado y en algún punto del camino mi archivo schema.rb ha desaparecido.¡Perdí mi schema.rb! Puede ser regenerado?

¿Hay alguna manera de regenerar schema.rb de la base de datos o de las migraciones? Preferiría no perder los datos existentes.

Respuesta

174

Si ejecuta un rake -T aparecerá una lista de todas las posibles tareas rastrillo para su proyecto de rieles. Uno de ellos es db: schema: dump que recreará schema.rb para la aplicación Rails de la base de datos.

bundle exec rake db:schema:dump 
+0

Muchas gracias, muchas respuestas pero parece que fueron las primeras (solo) tan buenas para usted. Simplemente curioso, ¿esto genera el esquema de la base de datos o de las migraciones? – brad

+7

Desde la base de datos en sí, así que tenga cuidado si hay cambios que ocurrieron fuera de las migraciones. – mguymon

+1

schema.rb todavía contiene el esquema vacío después de 'rake db: schema: dump' on rails 2.0 –

11
rake db:schema:dump 

Creo que esto sigue siendo válido en Rails 3 - se regenera el schema.rb de la base de datos.

3

Si regenera schema.rb localmente, debería estar bien. Simplemente contiene una representación de la estructura de las tablas de su base de datos. Los datos en sí no están contenidos en este archivo.

para regenerar el archivo schema.rb, ejecute:

bundle exec rake db:schema:dump 

Después, simplemente cometer el nuevo archivo schema.rb y usted debe estar en buena forma!

46

cuidadosa,

rake db:schema:dump 

se volcar el esquema de base de datos actual de la BD. Esto significa que si realizó algún cambio en sus migraciones, se reflejarán en NOT en el archivo schema.rb que no es lo que desea IMO.

Si desea volver a crear el esquema de las migraciones, haga lo siguiente:

rake db:drop # ERASES THE DATABASE !!!! 
rake db:create 
rake db:migrate 
+0

Eso daría como resultado la pérdida de datos, que el OP dijo que querían evitar. Además, como señala Colin, regenerar la base de datos puramente a partir de las migraciones es potencialmente una muy mala idea debido a la mayor posibilidad de incursionar en problemas de dependencia extraños (en términos generales). Si hay migraciones pendientes, probablemente sea mejor ejecutar esas últimas migraciones en la máquina de desarrollo y luego ejecutar el comando 'rake db: schema: dump'. –

+2

Cada lienzo se explica claramente en mi respuesta. Me han picado EXACTAMENTE al ejecutar solo el esquema: volcar y no obtener un esquema limpio. El OP está hablando de seguir el esquema en un CVS. Me gustaría tener mi esquema alineado con mis definiciones en mis migraciones y no una versión obsoleta de un DB de producción o un DB de desarrollo anterior – gamov

3

directamente desde el archivo schema.rb sí:

Si usted necesita para crear la aplicación base de datos en otro sistema , debe usar db:schema:load, no ejecutar todas las migraciones desde cero. Este último es un enfoque defectuoso e insostenible (cuantas más migraciones acumules, más lento se ejecutará y mayor será la probabilidad de que surjan problemas).

así que no lo hacen la sugerencia de rake db:migrate, que fue sugerido en el - en el momento de escribir estas líneas - respuesta de menor potencia.

+0

Probablemente quiera ejecutar las últimas migraciones pendientes si hay alguna en su máquina de desarrollo antes de regenerar el esquema, pero sí regenerar la base de datos puramente a partir de las migraciones es una muy mala idea, especialmente dado que eso daría como resultado la pérdida de datos. –

0

También tuve un problema similar cuando mi esquema anterior no era refrescante incluso si borraba la migración.

Entonces, lo que hice fue eliminar todas las tablas existentes en la base de datos y migrarlas de nuevo. Luego, ejecutar el comando "db: schema: load" me dio un nuevo schema.rb.

drop table my_table_name // deleted them indivisully 
rake db:migrate 
rake db:schema:dump // re-created a new schema 
2

CARRILES 5 vías:

rails db:schema:dump 

o si encuentra Gem :: LoadError a continuación:

bundle exec rails db:schema:dump 

Nota:

en los carriles 5 se recomienda que la tarea se genere/ejecute mediante el uso de rails en lugar de rake, esto es sólo para recordar, los carriles de la tarea generada son de extensión .rake ver en lib/tasks/myTask.rake. lo que significa que estas tareas también pueden ejecutarse anteponiendo rake.