Diferencia entre rake db: migrate db: reset y db: schema: load


La diferencia entre rake db:migrate y rake db:reset está bastante clara en mi cabeza. Lo que no entiendo es cuán rake db:schema:load diferente de los dos anteriores.

Solo para estar seguro de que estoy en la misma página:

  • rake db:migrate - Ejecuta las migraciones que aún no se han ejecutado.
  • rake db:reset - Borra la base de datos (presumiblemente hace un rake db:drop + rake db:create + rake db:migrate) y ejecuta la migración en una base de datos nueva.

Por favor ayuda a aclarar, si mi entendimiento ha ido mal.

Author: ekremkaraca, 2012-04-24

4 answers

  • db:migrate ejecuta migraciones (individuales) que aún no se han ejecutado.
  • db: create crea la base de datos
  • db: drop elimina la base de datos
  • Db: schema: load crea tablas y columnas dentro de la base de datos (existente) que sigue al esquema.rb

  • Db: setup hace db: create, db:schema:load, db:seed

  • db: reset hace db: drop, db: setup

Normalmente, utilizarías db: migrate después de haber realizado cambios en el esquema a través de nuevos archivos de migración (esto tiene sentido solo si ya hay datos en la base de datos). db: schema: load se utiliza cuando se configura una nueva instancia de la aplicación.

Espero que eso ayude.


ACTUALIZACIÓN para rails 3.2.12:

Acabo de comprobar la fuente y las dependencias son así ahora:

  • db: create crea la base de datos para el env
  • db: create: all crea las bases de datos para todos envs
  • db: drop suelta la base de datos para el env actual
  • db: drop: all suelta las bases de datos para todos los envs
  • db: migrate ejecuta migraciones para el env actual que aún no se han ejecutado
  • db: migrate: up ejecuta una migración específica
  • db: migrate: down hace retroceder una migración específica
  • db: migrate: status muestra el estado actual de la migración
  • db: rollback hace retroceder el último migración
  • db: forward avanza la versión actual del esquema a la siguiente
  • db: seed (solo) ejecuta el db/seed.rb file
  • db: schema: load carga el esquema en la base de datos env actual
  • Db: schema: dump vuelca el esquema de env actual (y parece crear la base de datos también)

  • Db: setup ejecuta db: schema: load, db: seed

  • db: reset ejecuta db: drop db: setup
  • db: migrate: rehacer se ejecuta (db:migrate:down db:migrate:up) o (db:rollback db: migrate) dependiendo de la migración especificada
  • db: migrate: reset ejecuta db: drop db: create db: migrate

Para más información, por favor, eche un vistazo a https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake (para los carriles 3.2.x) y https://github.com/rails/rails/blob/v4.0.5/activerecord/lib/active_record/railties/databases.rake (para Rails 4.0.x)

 1149
Author: moritz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-27 14:27:48

TLDR

Use

  • rake db:migrate Si desea realizar cambios en el esquema
  • rake db:reset Si desea eliminar la base de datos, vuelva a cargar el esquema desde schema.rb y vuelva a sembrar la base de datos
  • rake db:schema:load Si desea restablecer la base de datos al esquema como se proporciona en schema.rb (Esto eliminará todos los datos)

Explicaciones

rake db:schema:load configurará el esquema como se proporciona en el archivo schema.rb. Esto es útil para una nueva instalación de la aplicación, ya que no toma tanto tiempo como db:migrate

Nota importante, db:schema:loadeliminará los datos en el servidor.

rake db:migrate realiza cambios en el esquema existente. Es como crear versiones de schema. db:migrate buscará en db/migrate/ cualquier fichero ruby y ejecutará las migraciones que aún no se ejecuten empezando por el más antiguo. Rails sabe qué archivo es el más antiguo mirando la marca de tiempo al principio del nombre del archivo de migración. db:migrate viene con el beneficio de que los datos también se pueden poner en la base de datos. En realidad, esto no es una buena práctica. Es mejor usar rake db:seed para agregar datos.

rake db:migrate proporciona tareas subir, abajo etc que habilita comandos como rake db:rollback y lo convierte en el comando más útil.

rake db:reset hace un db:drop y db:setup
Suelta la base de datos, la crea de nuevo, carga el esquema e inicializa con los datos de semilla

Parte relevante de los comandos de las bases de datos .rake


namespace :schema do
  desc 'Creates a db/schema.rb file that is portable against any DB supported by Active Record'
  task :dump => [:environment, :load_config] do
    require 'active_record/schema_dumper'
    filename = ENV['SCHEMA'] || File.join(ActiveRecord::Tasks::DatabaseTasks.db_dir, 'schema.rb')
    File.open(filename, "w:utf-8") do |file|
      ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
    end
    db_namespace['schema:dump'].reenable
  end

  desc 'Loads a schema.rb file into the database'
  task :load => [:environment, :load_config, :check_protected_environments] do
    ActiveRecord::Tasks::DatabaseTasks.load_schema_current(:ruby, ENV['SCHEMA'])
  end

  # desc 'Drops and recreates the database from db/schema.rb for the current environment and loads the seeds.'
  task :reset => [ 'db:drop', 'db:setup' ]

namespace :migrate do
  # desc  'Rollbacks the database one migration and re migrate up (options: STEP=x, VERSION=x).'
  task :redo => [:environment, :load_config] do
    if ENV['VERSION']
      db_namespace['migrate:down'].invoke
      db_namespace['migrate:up'].invoke
    else
      db_namespace['rollback'].invoke
      db_namespace['migrate'].invoke
    end
  end
 16
Author: sudo bangbang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-14 00:09:49

Por lo que entiendo, va a soltar su base de datos y volver a crearla en función de su archivo db/schema.rb. Es por eso que debe asegurarse de que su archivo schema.rb esté siempre actualizado y bajo control de versiones.

 2
Author: Simon Bagreev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-24 16:25:21

Simplemente podría buscar en las tareas de Rake de Active Record, ya que es donde creo que viven como en este archivo. https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb

Lo que hacen es tu pregunta?

Eso depende de dónde vienen y esto es justo y ejemplo para mostrar que varían dependiendo de la tarea. Aquí tenemos un archivo diferente lleno de tarea.

Https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/Rakefile

Que tiene estas tareas.

namespace :db do
  task create: ["db:mysql:build", "db:postgresql:build"]
  task drop: ["db:mysql:drop", "db:postgresql:drop"]
end

Esto puede no responder a su pregunta, pero podría darle una idea de seguir adelante y mirar la fuente sobre especialmente los archivos y tareas de rake. Como hacen un buen trabajo ayudándote a usar rails, no siempre documentan el código tan bien. Todos podríamos ayudar allí si sabemos lo que se supone que debe hacer.

 0
Author: Douglas G. Allen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-04 22:24:09