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?

Un aprendiz
fuente
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.

thenengah
fuente
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.

Eneko Alonso
fuente
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+
TK
fuente
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
Robbie Guilfoyle
fuente
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.

coreyward
fuente
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
usuario2747051
fuente
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!

Shrivastava Manish
fuente
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
Малъ Скрылевъ
fuente
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.

Erik Trautman
fuente
6

Puede usar esta siguiente línea de comando:

rake db:drop db:create db:migrate db:seed db:test:clone
usuario1358180
fuente
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 
Kush
fuente
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

Yana Agun Siswanto
fuente
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

Aleksandr Babak
fuente
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
Víctor
fuente
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

Obed Lorisson
fuente
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
Thorin
fuente
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.

Touseef Murtaza
fuente
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.
urko
fuente
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"])
ardochhigh
fuente