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

619

La diferencia entre rake db:migratey rake db:resetes bastante clara en mi cabeza. Lo que no entiendo es cuán rake db:schema:loaddiferente de los dos anteriores.

Solo para asegurarme 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 nueva base de datos.

Por favor, ayuda a aclarar, si mi comprensión ha salido mal.

Gaurav Agarwal
fuente
10
Ciervas rake --tasksayuda?
zx1986
Deberías consultar este blog. jacopretorius.net/2014/02/…
Bishisht Bhatta
Su comprensión de rake db:migratees correcta, pero su comprensión de rake db:resetes incorrecta. Vea la respuesta más importante, de Moritz.
Magne
1
Por cierto, a partir de los carriles 5, estos comandos pueden ser invocados como rails db:migrate, rails db:reset, rails db:schema:load. Ver stackoverflow.com/questions/38403533/…
Purplejacket

Respuestas:

1303
  • 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) después de schema.rb

  • db: setup hace db: create, db: esquema: carga, db: semilla

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

Normalmente, usaría 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 usa cuando configura una nueva instancia de su aplicación.

Espero que eso ayude.


ACTUALIZACIÓN para rieles 3.2.12:

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

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

  • db: la instalación se ejecuta db: esquema: carga, db: semilla

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

Para obtener más información, consulte https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake (para Rails 3.2.x) y https: // github .com / rails / rails / blob / v4.0.5 / activerecord / lib / active_record / railties / database.rake (para Rails 4.0.x)

Moritz
fuente
16
Aquí está el archivo con respuestas :) - github.com/rails/rails/blob/master/activerecord/lib/…
cutalion
3
@cutation: db: setup seguramente no ejecuta db: migrate, porque sería demasiado frágil ejecutar todas las migraciones solo para una configuración de db (para eso es schema.rb).
Moritz
2
Estoy ejecutando db: reset y está sembrando mi db. ¿Por qué podría ser?
Alejandro Riedel
db: la instalación también se ejecuta db:createsi es necesario. Al menos a partir de los carriles 4.0.2.
Dan
Los rieles 4 funcionarán rake db:migrateal llamar rake db:setupsi hay migraciones pendientes pero no ejecutarán migraciones pendientes.
Pooyan Khosravi el
24

TLDR

Utilizar

  • rake db:migrate Si quieres hacer cambios al esquema
  • rake db:resetSi desea descartar la base de datos, vuelva a cargar el esquema schema.rby vuelva a iniciar la base de datos
  • rake db:schema:loadSi desea restablecer la base de datos al esquema según lo dispuesto en schema.rb(Esto eliminará todos los datos)

Explicaciones

rake db:schema:loadconfigurará el esquema según lo dispuesto en el schema.rbarchivo. Esto es útil para una nueva instalación de la aplicación, ya que no lleva tanto tiempo comodb:migrate

Nota importante, db:schema:loadva a borrar los datos en el servidor.

rake db:migraterealiza cambios en el esquema existente. Es como crear versiones de esquema. db:migratebuscará db/migrate/cualquier archivo ruby ​​y ejecutará las migraciones que aún no se ejecutan comenzando por la más antigua. Rails sabe qué archivo es el más antiguo al observar la marca de tiempo al comienzo del nombre de archivo de migración. db:migrateviene con un beneficio de que los datos también se pueden poner en la base de datos. Esto en realidad no es una buena práctica. Es mejor usar rake db:seedpara agregar datos.

rake db:migrateproporciona tareas hacia arriba , hacia abajo , etc., lo que permite comandos como rake db:rollbacky lo convierte en el comando más útil.

rake db:resethace una db:dropy db:setup
cae la base de datos, crear de nuevo, el esquema de cargas, e inicializa con los datos de semillas

Parte relevante de los comandos de 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
sudo bangbang
fuente
Entonces, si crea su esquema de producción usando db: schema: load (creado a partir de una serie de migraciones anteriores), sabrá qué migraciones (las que tomaron parte en la creación del esquema inicial.rb) no necesitan ejecutarse en el futuro invocaciones de db: migrate?
CanadaIT
2

Según tengo entendido, va a soltar su base de datos y volver a crearla en función de su db/schema.rbarchivo. Es por eso que debe asegurarse de que su schema.rbarchivo esté siempre actualizado y bajo control de versión.

Simon Bagreev
fuente
0

Simplemente puede mirar en las tareas Active Record Rake, 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 ¿verdad?

Eso depende de dónde provienen y esto es solo un ejemplo para mostrar que varían según la tarea. Aquí tenemos un archivo diferente lleno de tareas.

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

Es posible que esto no responda a su pregunta, pero podría darle una idea de cómo seguir adelante y revisar la fuente, especialmente los archivos y tareas de rastrillo. Como hacen un trabajo bastante bueno al ayudarlo a usar rieles, no siempre documentan bien el código. Todos podríamos ayudar allí si sabemos lo que se supone que debe hacer.

Douglas G. Allen
fuente
Cite las partes relevantes del artículo en caso de que se elimine. No sugiera hacer algo sin explicar por qué.
PhilT
0

ACTUALIZADO para Rails 5:

db:create- Crea la base de datos para el entorno RAILS_ENV actual . Si RAILS_ENV no se especifica, el valor predeterminado es el desarrollo y las bases de datos de prueba.

db:create:all - Crea la base de datos para todos los entornos.

db:drop- Descarta la base de datos para el entorno RAILS_ENV actual . Si RAILS_ENV no se especifica, el valor predeterminado es el desarrollo y las bases de datos de prueba.

db:drop:all - Descarta la base de datos para todos los entornos.

db:migrate- Ejecuta migraciones para el entorno actual que aún no se han ejecutado. Por defecto, ejecutará migraciones solo en el entorno de desarrollo.

db:migrate:redo- Ejecuta db: migrate: down y db: migrate: up o db: migrate: rollback y db: migrate: up según la migración especificada.

db:migrate:up - Ejecuta la versión de migración dada.

db:migrate:down - Ejecuta el down para la VERSIÓN de migración dada.

db:migrate:status - Muestra el estado actual de la migración.

db:migrate:rollback - Retrocede la última migración.

db:version - Imprime la versión actual del esquema.

db:forward - Empuja el esquema a la próxima versión.

db:seed- Ejecuta el archivo db / seeds.rb .

db:schema:loadRecrea la base de datos del archivo schema.rb .

db:schema:dumpVuelca el esquema del entorno actual en db / schema.rb .

db:structure:load- Recrea la base de datos del archivo structure.sql .

db:structure:dump- Volca el esquema del entorno actual a db / structure.sql . (Puede especificar otro archivo con SCHEMA=db/my_structure.sql)

db:setupEjecuta db: create , db: schema: load y db: seed .

db:resetEjecuta db: drop y db: setup . db:migrate:reset- Ejecuta db: drop , db: create y db: migrate .

db:test:prepare- Compruebe si hay migraciones pendientes y cargue el esquema de prueba. (Si ejecuta rake sin ningún argumento, lo hará de forma predeterminada).

db:test:clone - Recree la base de datos de prueba del esquema de base de datos del entorno actual.

db:test:clone_structure- Similar a db: test: clone , pero se asegurará de que su base de datos de prueba tenga la misma estructura, incluidos charsets y colaciones, que la base de datos de su entorno actual.

db:environment:set- Establecer el entorno RAILS_ENV actual en ar_internal_metadata tabla . (Utilizado como parte de la verificación del entorno protegido).

db:check_protected_environments- Comprueba si se puede realizar una acción destructiva en el entorno RAILS_ENV actual . Se usa internamente cuando se ejecuta una acción destructiva como db: drop o db: schema: load .

Ваня Скоцик
fuente