Purgar o recrear una base de datos de Ruby on Rails

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

rake db:recreate

¿Es esto posible?

preguntado el 06 de noviembre de 10 a las 22:11

Sugeriría mirar más allá de la respuesta más votada. En mi opinión rake db:drop db:create db:schema:load podría ser más apropiado que rake db:drop db:create db:migrate (aunque estoy dispuesto a equivocarme en eso). -

rake db:drop db:create db:migrate -

db:drop + db:create + db:migrate == db:migrate:reset. Suelo recurrir a db:schema:load, cuando se rompen las migraciones. Rara vez necesito volver a crear la base de datos, por lo que la velocidad no importa mucho. Además, si tiene migraciones sin aplicar, db:schema:load y db:reset no los aplicará. No estoy seguro de si eso es un gran argumento. -

21 Respuestas

Conozco dos formas de hacer esto:

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

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.

respondido 04 mar '15, 02:03

Parece rake db:reset también ejecuta todas las migraciones (al menos en Rails 3), por lo que debería ser todo lo que se necesita, ¿verdad? - Plindberg

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

Sé que para la aplicación Tracks GTD db: migrate no funcionó. Tuve que hacer db: reset al pasar de Sqlite3 a Postgres. - laberinto

También necesitarás correr rake db:test:prepare para probar, o de lo contrario obtendrá un error como: Could not find table 'things' (ActiveRecord::StatementInvalid) - s2t2

Alguien debería dejar claro que rake db:reset y 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.rb or db/structure.sql), pero no lo 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 esquemay luego se completa con datos de inicialización. Entonces, si no ha cambiado nada en sus migraciones, la primera es más rápida, la segunda es más segura. - claudio floreani

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.

Respondido el 20 de enero de 14 a las 04:01

también funciona para los rieles 3. útil para cuando acaba de estropear su base de datos de prueba y desea restablecerla a una versión funcional que coincida con su dev db - patata grande

Gracias por esto. No me di cuenta de eso db:drop y db:create eran redundantes. - conceder birchmeier

Esto no actualiza el esquema, no es una forma segura si refactoriza sus migraciones. - claudio floreani

esta es la mejor respuesta para mi. - roxdurazo

@ClaudioFloreani refactorizar las migraciones está buscando problemas. Una vez que se ejecutan, deben dejarse solos, permanentemente. - zzz

Utilizo el siguiente trazador de líneas en 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 nombré remigrate

A estas alturas, 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+

Respondido el 26 de junio de 18 a las 15:06

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 schema: dump no está haciendo nada útil. - coreyward

entonces, ¿cómo se vacía la base de datos? en desarrollo ... aclararlo todo. - Un aprendiz

@AnApprentice Puede ejecutar db:reset, que es solo un Google (o consulte la Guías) fuera. Mi comentario no fue para desaconsejar el uso de eso, sino para evitar usar db:migrate cuando lo que realmente quieres es db:schema:load. - coreyward

Por cierto, @TK, realmente no necesita ejecutar todos estos como procesos separados que dependen del estado de salida del último. En su lugar, pase todas las tareas deseadas a rake, al igual que: rake db:drop db:create db:schema:load. - coreyward

Es anecdótico, pero nunca tuve problemas para ejecutar db:migrate... mientras que db:schema:load es sensible a que alguien se olvide de verificar schema.rb en el control de versiones junto con una nueva migración. - juancip

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: cometer

# 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 junto como se mencionó anteriormente:

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

contestado el 02 de mayo de 19 a las 18:05

Como dice @bekicot en un inglés más sencillo db:purge "eliminar todos los datos pero conservar toda la tabla y las columnas" - MCB

@MCB Me equivoqué, lo siento, db:purge no está conservando las tablas. - Yana Agún Siswanto

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 crear la base de datos desde cero desde su schema.rb archivo.

respondido 07 nov., 10:01

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

+1 para carga de esquema. a veces las migraciones se estropean, 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 fue 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 solo cargar la base de datos desde el esquema que ejecutar un montón de migraciones. - jason swett

El razonamiento es que las migraciones están destinadas a migrado datos, y se vuelven cada vez más frágiles con el tiempo a medida que cambian los modelos. Puede (y debe) incluir modelos de alcance mínimo en sus migraciones siempre que sea posible para garantizar que se ejecuten, pero esto simplemente no se 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 simplemente construir a partir del proyecto mismo? - coreyward

Desde la línea de comando ejecutar

rake db:migrate:reset

respondido 24 mar '14, 23:03

esta es la única forma que hace que la aplicación vuelva a ejecutar todas las migraciones. Porque cada migración hace cambios a schema.rb y si tu solo drop y create, migrate no hará nada (probado en rieles 6) - champú

Usar como

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

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

db: gota - soltará la base de datos.

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

db: migrar - ejecutará migraciones existentes desde el directorio (db / migración /.rb) *.

db: semilla - ejecutará los datos semilla posibles desde el directorio (db / migración / seed.rb)..

Por lo general prefiero:

rake db:reset

para hacer todo a la vez.

¡Aclamaciones!

Respondido 20 Abr '15, 08:04

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

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

Simplemente emita la secuencia de los pasos: elimine 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 rake is Desarrollo, en caso de que vea la excepción en las pruebas de especificaciones, debe volver a crear la base de datos para el test entorno 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 lo que db:seed no es necesario aprobar la acción de la tarea. De lo contrario, deberá preparar la base de datos:

rake db:test:prepare

or

RAILS_ENV=test rake db:seed

Además, para utilizar el recrear tarea que puedes agregar archivo de rake 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

Entonces emita:

rake db:recreate

Respondido el 28 de enero de 14 a las 07:01

Puede hacer manualmente:

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

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

Un matiz adicional es que rake db:reset se carga directamente desde su schema.rb archivo en lugar de ejecutar de nuevo todos los archivos de migraciones.

Tus datos se pierden en todos los casos.

Respondido 14 Oct 13, 03:10

Puede utilizar la siguiente línea de comando:

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

Respondido 14 Oct 14, 13:10

Para eliminar 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 

respondido 06 nov., 13:10

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

Respondido 06 Abr '16, 14:04

Bueno ... Lo acabo de intentar, pero no conserva tablas y columnas. Tienes que ejecutar un db: migrate después de haber ejecutado un db: purge. Entonces esto no preserva tablas y columnas. Sin embargo, conserva la base de datos en sí para que no tenga que db: create - Frío

@Cedric Tienes razón, db: purge no es preservar la tabla. Actualicé el código. - Yana Agún Siswanto

Puedes 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 el que desea utilizar existe schema.rb

Respondido 06 Abr '17, 03:04

En Rails 6 hay una forma conveniente de restablecer DB y plantar semillas nuevamente:

rails db:seed:replant # Truncates tables of each database for current environment and loads the seeds

https://weblog.rubyonrails.org/2019/3/15/this-week-in-rails-security-fixes-bulk-insert-and-upsert-seeds-replanting/

Respondido el 11 de diciembre de 20 a las 10:12

Según Guía de rieles, este revestimiento debe usarse porque se cargaría desde el schema.rb en lugar de volver a cargar los archivos de migración uno por uno:

rake db:reset

Respondido 01 Oct 13, 09:10

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

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

y en terminal correrás

rake db:all

reconstruirá tu base de datos

Respondido 25 Jul 15, 19:07

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

Respondido 19 Abr '16, 08:04

Simplemente puedes correr

rake db:setup

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

Respondido el 27 de junio de 18 a las 10:06

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. Reset:

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

3. Migrar: restablecer:

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

Notas

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

Respondido el 20 de junio de 19 a las 21:06

Hoy he realizado bastantes cambios en el esquema de mis rieles. Me di cuenta de que necesitaba dos modelos adicionales en una jerarquía y algunos otros para eliminarlos. 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 eran necesarios, cambié el campo de clave externa según lo requerido y simplemente lo reordené un poco para que quede más claro para mí. I borrado todas las migraciones, y luego volvió a ejecutar la compilación a través de:

rake db:reset

Funcionó perfectamente. Todos los datos deben recargarse, por supuesto. Rails se dio cuenta de que las migraciones se habían eliminado y restableció la marca de agua máxima:

-- assume_migrated_upto_version(20121026094813, ["/Users/sean/rails/f4/db/migrate"])

Respondido 26 Oct 12, 12:10

Yo uso:

  • rails db:drop para eliminar las bases de datos.
  • rails db:create para crear las bases de datos basadas en config/database.yml

Los comandos anteriores se pueden reemplazar con rails db:reset.

No te olvides de correr rails db:migrate para ejecutar las migraciones.

Respondido el 07 de enero de 21 a las 17:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.