Perdí mi schema.rb! ¿Se puede regenerar?

133

Debido a algunos problemas de implementación, dejé de rastrear schema.rb en git. De alguna manera, he rellenado esto y, en algún momento, mi archivo schema.rb ha desaparecido.

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

puntilla
fuente

Respuestas:

230

Si ejecuta un rake -T, enumerará todas las posibles tareas de rake para su proyecto Rails. Uno de ellos es db: schema: dump, que recreará el schema.rb para la aplicación Rails desde la base de datos.

bundle exec rake db:schema:dump
mguymon
fuente
Muchas gracias, muchas respuestas, pero parece que fuiste el primero (solo), así que marca para ti. Por curiosidad, ¿genera esto el esquema de la base de datos o de las migraciones?
Brad
77
Desde la base de datos en sí, tenga cuidado si hay cambios que ocurrieron fuera de las migraciones.
mguymon
1
schema.rb todavía contiene un esquema vacío después rake db:schema:dumpde rails 2.0
Will Hardwick-Smith
Mi archivo schema.rb permanece exactamente igual después de ejecutar los comandos anteriores
stevec
59

Cuidado,

rake db:schema:dump

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

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

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate
gamov
fuente
1
Eso daría como resultado la pérdida de datos, que el OP dijo que querían evitar. Además, como señala Colin, la regeneración de la base de datos únicamente a partir de las migraciones es potencialmente una muy mala idea debido a la mayor posibilidad de encontrarse con problemas de dependencia extraños (en general). Si hay migraciones pendientes, probablemente sería mejor ejecutar esas últimas migraciones en la máquina de desarrollo y luego ejecutar el rake db:schema:dumpcomando.
Paul Richter
44
Cada lienzo se explica claramente en mi respuesta. Me mordieron EXACTAMENTE ejecutando solo el esquema: volcar y no obtener un esquema limpio. El OP habla de seguir el esquema en un CVS. Me gustaría alinear mi esquema con mis definiciones en mis migraciones y no una versión obsoleta de una base de datos de producción o una base de datos de desarrollo anterior
gamov
11
rake db:schema:dump

Creo que esto todavía es válido en Rails 3: regenera el schema.rb de la base de datos.

pschuegr
fuente
8

RAILS 5 Way:

rails db:schema:dump

o si encuentras Gem :: LoadError entonces:

bundle exec rails db:schema:dump

Nota:

en los carriles 5, se recomienda que la tarea se generan / ejecutada utilizando railsen lugar de rake, esto es sólo para recordar, carriles generada tarea de la extensión se .rakeverá en lib/tasks/myTask.rake. lo que significa que esta tarea también se puede ejecutar anteponiendo rake.

Kaleem Ullah
fuente
5

Si te regeneras schema.rblocalmente, deberías 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 su schema.rbarchivo, ejecute:

bundle exec rake db:schema:dump

¡Entonces simplemente confirme el nuevo schema.rbarchivo y debería estar en buena forma!

Graham Swan
fuente
4

Directamente desde el archivo schema.rb:

Si necesita crear la base de datos de la aplicación en otro sistema, debería estar utilizando db:schema:load, no ejecutando todas las migraciones desde cero. Este último es un enfoque defectuoso e insostenible (cuantas más migraciones acumule, más lenta será la ejecución y mayor probabilidad de problemas).

Por lo tanto, NO haga la sugerencia de rake db:migrate, que se sugirió en la respuesta de menor calificación al momento de escribir este artículo.

Colin Summers
fuente
Es probable que desee 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 exclusivamente a partir de las migraciones es una muy mala idea, especialmente porque eso provocaría la pérdida de datos.
Paul Richter
1

También tuve un problema similar en el que mi antiguo esquema no se actualizaba incluso si eliminaba la migración.

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

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
R.Cha
fuente