Purgue o vuelva a crear una base de datos Ruby on Rails


582

Tengo una base de datos dev Ruby on Rails llena de datos. Quiero eliminar todo y reconstruir la base de datos. Estoy pensando en usar algo como:

rake db:recreate

es posible?


Sugeriría mirar más allá de la respuesta más votada. En mi opinión, rake db:drop db:create db:schema:loadpodría ser más apropiado que rake db:drop db:create db:migrate(aunque estoy listo para estar equivocado al respecto).
Jason Swett


2
rake db:drop db:create db:migrate
William Hampshire

db:drop + db:create + db:migrate == db:migrate:reset. Por lo general db:schema:load, recurro cuando las migraciones se rompen. Raramente necesito recrear la base de datos, por lo que la velocidad no importa mucho. Además, si tiene migraciones no aplicadas db:schema:loady db:resetno las aplicará. No estoy seguro si eso es un gran argumento.
x-yuri

Respuestas:


1074

Sé dos maneras de hacer esto:

Esto restablecerá su base de datos y volverá a cargar su esquema actual con todos:

rake db:reset db:migrate

Esto destruirá su base de datos y luego la creará y luego migrará su esquema actual:

rake db:drop db:create db:migrate

Todos los datos se perderán en ambos escenarios.


36
Parece que rake db:resettambién ejecuta todas las migraciones (al menos en Rails 3), así que eso debería ser todo lo que se necesita, ¿verdad?
plindberg

1
O, más bien, deja el esquema idéntico al que tendrían todas las migraciones. Pero las migraciones no se ejecutan per se (por lo que si tiene migraciones que insertan datos, eso no sucederá; para esto, realmente debería usar un archivo db / seeds.rb).
plindberg

1
Sé que para la aplicación Tracks GTD db: migrate no funcionó. Tuve que hacer db: reset cuando me mudé de Sqlite3 a Postgres.
laberinto

11
También deberá ejecutar la rake db:test:prepareprueba, o de lo contrario obtendrá un error como:Could not find table 'things' (ActiveRecord::StatementInvalid)
s2t2

31
Alguien debería aclarar eso rake db:resety rake db:drop db:create db:migrate hacer dos cosas completamente diferentes . Este último borra toda la base de datos de la aplicación, la recrea y luego pasa por cada migración para actualizar el esquema ( db/schema.rbo db/structure.sql), pero no la llena con datos semilla. El primero, en cambio, es un alias para rake db:drop db:schema:load db:seed, por lo que borra toda la base de datos de la aplicación, pero no actualiza el esquema , y luego se completa con datos semilla. Entonces, si no ha cambiado nada en sus migraciones, la primera es más rápida, la segunda es más segura.
Claudio Floreani

157

En Rails 4, todo lo que se necesita es

$ rake db:schema:load

Eso eliminaría todo el contenido de su base de datos y volvería a crear el esquema de su archivo schema.rb, sin tener que aplicar todas las migraciones una por una.


66
funciona para rieles 3 también. útil para cuando acaba de estropear su base de datos de prueba y desea restablecerla a una versión que funcione que coincida con su dev db
bigpotato

Gracias por esto. No me di cuenta de eso db:dropy fui db:createredundante.
Grant Birchmeier

3
Esto no actualiza el esquema, no es una forma segura si refactoriza sus migraciones.
Claudio Floreani

Esta es la mejor respuesta para mí.
roxdurazo

2
@ClaudioFloreani refactorizar migraciones es pedir problemas. Una vez que se ejecutan, se deben dejar solos, permanentemente.
nrowegt

45

Yo uso el siguiente trazador de líneas en la Terminal.

$ rake db:drop && rake db:create && rake db:migrate && rake db:schema:dump && rake db:test:prepare

Puse esto como un alias de shell y lo llamé remigrate

Por ahora, puede "encadenar" fácilmente las tareas de Rails:

$ rake db:drop db:create db:migrate db:schema:dump db:test:prepare # db:test:prepare no longer available since Rails 4.1.0.rc1+

12
Eso ejecutará todas sus migraciones una tras otra, lo que no es escalable y es propenso a errores. Además, estoy bastante seguro de que db: migrate actualiza su schema.rb, por lo que su esquema: dump no está haciendo nada útil.
coreyward

Entonces, ¿cómo se vacía la base de datos? en desarrollo ... aclararlo todo.
AnApprentice el

3
@AnApprentice Puede ejecutar db:reset, que es solo un Google (o consultar las Guías ) de distancia. Mi comentario no fue desaconsejar el uso de eso, sino evitar usar db:migratecuando lo que realmente quieres es db:schema:load.
coreyward

77
Por cierto, @TK, realmente no necesita ejecutar todo esto como procesos separados que dependen del estado de salida de la última. En su lugar, sólo tiene que pasar todas las tareas deseadas para rake, de este modo: rake db:drop db:create db:schema:load.
coreyward

1
Es anecdótico, pero nunca he tenido un problema al ejecutar db:migrate... mientras que db:schema:loades sensible a alguien que olvida comprobar schema.rb en el control de versiones junto con una nueva migración.
johncip

37

Actualización: en Rails 5, este comando será accesible a través de este comando:

rails db:purge db:create db:migrate RAILS_ENV=test


A partir de la versión más reciente de rails 4.2, ahora puede ejecutar:

rake db:purge 

Fuente: commit

# desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases."
  task :purge => [:load_config] do
    ActiveRecord::Tasks::DatabaseTasks.purge_current
  end

Se puede usar juntos como se mencionó anteriormente:

rake db:purge db:create db:migrate RAILS_ENV=test

Como dice @bekicot en inglés simple db:purge"elimine todos los datos pero conserve todas las tablas y columnas"
MCB

@MCB Me equivoqué, pero eso db:purge no sirve para preservar las tablas.
Yana Agun Siswanto

29

Dependiendo de lo que quieras, puedes usar ...

rake db:create

... para construir la base de datos desde cero config/database.yml, o ...

rake db:schema:load

... para construir la base de datos desde cero desde su schema.rbarchivo.


1
Primero debe soltar la base de datos ... o simplemente puede eliminar las tablas si lo prefiere.
coreyward

55
+1 para carga de esquema. a veces las migraciones se complican, pero el esquema debe ser lo que se mantiene intacto.
Danny

Leí en The Rails 3 Way que cargar el esquema es el camino a seguir, en lugar de ejecutar todas las migraciones. No recuerdo exactamente cuál era su razonamiento, pero parece tener sentido. Si el resultado final es el mismo de cualquier manera, parece más simple y menos propenso a errores simplemente cargar la base de datos desde el esquema que ejecutar un montón de migraciones.
Jason Swett

3
El razonamiento es que las migraciones están destinadas a migrar datos, y se vuelven cada vez más frágiles con el tiempo a medida que cambian sus modelos. Puede (y debe) hornear en modelos de alcance mínimo en sus migraciones siempre que sea posible para garantizar que se ejecuten, pero esto simplemente no escala bien y es mucho menos eficiente que simplemente construir la base de datos a partir de lo que la aplicación sabe que es el punto final . ¿Por qué confiar en las migraciones para crear una base de datos que se parezca a su esquema cuando puede construir desde el propio plano?
coreyward

13

Desde la línea de comando ejecutar

rake db:migrate:reset

Esta es la única manera que hace que la aplicación vuelva a ejecutar todas las migraciones. Debido a que cada migración realiza cambios en schema.rby si solo dropy create, migrateno hará nada (probado en los rieles 6)
champú

12

Usar como

rake db:drop db:create db:migrate db:seed

Todo en una linea. Esto es más rápido ya que el entorno no se recarga una y otra vez.

db: drop : soltará la base de datos.

db: create: creará una base de datos (host / db / contraseña se tomará de config / database.yml)

db: migrate: ejecutará las migraciones existentes desde el directorio (db / migration / .rb) *.

db: seed - ejecutará los datos de semillas posibles desde el directorio (db / migration / seed.rb) .

Generalmente prefiero:

rake db:reset

hacer todo a la vez.

¡Salud!


1
Me gusta agregar db: test: prepárate para esto, por si acaso. Esto depende, por supuesto, de si estás probando o no.
ctc

db:reset == db:drop + db:schema:load + db:seed,db:migrate:reset == db:drop + db:create + db:migrate
x-yuri

11

Simplemente emita la secuencia de los pasos: suelte la base de datos, luego vuelva a crearla, migre los datos y, si tiene semillas, siembre la base de datos:

rake db:drop db:create db:migrate db:seed

Dado que el entorno predeterminado para el desarrollorake es , en caso de que vea la excepción en las pruebas de especificaciones, debe volver a crear db para el entorno de prueba de la siguiente manera:

RAILS_ENV=test rake db:drop db:create db:migrate

En la mayoría de los casos, la base de datos de prueba se siembra durante los procedimientos de prueba, por db:seedlo que no es necesario pasar la acción de la tarea. De lo contrario, deberá preparar la base de datos:

rake db:test:prepare

o

RAILS_ENV=test rake db:seed

Además, para usar la tarea de recreación , puede agregar a Rakefile el siguiente código:

namespace :db do
   task :recreate => [ :drop, :create, :migrate ] do
      if ENV[ 'RAILS_ENV' ] !~ /test|cucumber/
         Rake::Task[ 'db:seed' ].invoke
      end
   end
end

Luego emita:

rake db:recreate

8

Puedes hacer manualmente:

rake db:drop
rake db:create
rake db:migrate

O simplemente rake db:reset, que ejecutará los pasos anteriores pero también ejecutará sudb/seeds.rb archivo.

Un matiz adicional es que rake db:reset carga directamente desde su schema.rbarchivo en lugar de ejecutar todos los archivos de migración nuevamente.

Sus datos se vuelan en todos los casos.


6

Puede usar esta siguiente línea de comando:

rake db:drop db:create db:migrate db:seed db:test:clone

4

Para descartar una base de datos en particular, puede hacer esto en la consola de rails:

$rails console
Loading development environment
1.9.3 > ActiveRecord::Migration.drop_table(:<table_name>)
1.9.3 > exit

Y luego migrar DB nuevamente

$bundle exec rake db:migrate 

4

En rails 4.2, para eliminar todos los datos pero preservar la base de datos

$ bin/rake db:purge && bin/rake db:schema:load

https://github.com/rails/rails/blob/4-2-stable/activerecord/CHANGELOG.md


Bueno ... solo lo intenté, pero no conserva tablas y columnas. Debe ejecutar un db: migrate después de haber ejecutado un db: purge. Por lo tanto, esto no conserva tablas y columnas. Sin embargo, conserva la base de datos en sí misma para que no tenga que db: create
Freddo

1
@Cedric Tienes razón, db: la purga no es preservar la tabla. Actualicé el código.
Yana Agun Siswanto

3

Puede usar db:reset- para ejecutar db: drop y db: setup o db:migrate:reset - que ejecuta db: drop, db: create y db: migrate.

dependiente en que desea utilizar existe schema.rb


2

De acuerdo con la guía de Rails , este forro debería usarse porque se cargaría desde el en schema.rblugar de volver a cargar los archivos de migración uno por uno:

rake db:reset

1

Debido a que en el desarrollo, siempre querrá volver a crear la base de datos, puede definir una tarea de rastrillo en su carpeta lib / tareas de esa manera.

  namespace :db do
      task :all => [:environment, :drop, :create, :migrate] do
   end 
end

y en la terminal correrás

rake db:all

reconstruirá su base de datos


1

Creo que la mejor manera de ejecutar este comando:

**rake db:reset** it does db:drop, db:setup
 rake db:setup does db:create, db:schema:load, db:seed

1

Simplemente puedes correr

rake db:setup

Caerá la base de datos, creará una nueva base de datos y completará db desde la semilla si creó un archivo semilla con algunos datos.


1

3 opciones, mismo resultado:

1. Todos los pasos:

  $ rake db:drop           # deletes the database for the current env
  $ rake db:create         # creates the database for the current env
  $ rake db:schema:load    # loads the schema already generated from schema.rb / erases data
  $ rake db:seed           # seed with initial data

2. Restablecer:

  $ rake db:reset          # drop / schema:load / seed

3. Migrar: restablecer:

  $ rake db:migrate:reset  # drop / create / migrate
  $ rake db:seed

Notas:

  • Si se utiliza el esquema: la carga es más rápido que hacer todas las migraciones, pero el mismo resultado.
  • Todos los datos se perderán.
  • Puede ejecutar varios rastrillos en una línea.
  • Funciona con rieles 3.

0

Hoy he realizado algunos cambios en mi esquema de rieles. Me di cuenta de que necesitaba dos modelos adicionales en una jerarquía y algunos otros para ser eliminados. Se requirieron muchos pequeños cambios en los modelos y controladores.

Agregué los dos nuevos modelos y los creé, usando:

rake db:migrate

Luego edité el archivo schema.rb. Eliminé manualmente los modelos antiguos que ya no se requerían, cambié el campo de clave externa según fuera necesario y simplemente lo reordené un poco para aclararlo. Me eliminado todas las migraciones, y luego re-encontré con la acumulación a través de:

rake db:reset

Funcionó perfectamente. Todos los datos tienen que recargarse, por supuesto. Rails se dio cuenta de que las migraciones se habían eliminado y restableció la marca de nivel superior:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.