ruby-on-rails - tasks - rails migrate up down




Diferença entre o rake db: migrate db: reset e db: schema: load (3)

A diferença entre o rake db:migrate e o rake db:reset é bastante clara na minha cabeça. O que eu não entendo é como o rake db:schema:load diferente dos dois anteriores.

Só para ter certeza de que estou na mesma página:

  • rake db:migrate - Executa as migrações que ainda não foram executadas.
  • rake db:reset - Limpa o banco de dados (presumivelmente faz um rake db:drop + rake db:create + rake db:migrate ) e executa a migração em um novo banco de dados.

Por favor, ajude a esclarecer se o meu entendimento deu errado.


TLDR

Usar

  • rake db:migrate Se você quiser fazer alterações no esquema
  • rake db:reset Se você deseja descartar o banco de dados, recarregue o esquema a partir do schema.rb e propague novamente o banco de dados
  • rake db:schema:load Se você deseja redefinir o banco de dados para o esquema conforme fornecido no schema.rb (Isso excluirá todos os dados)

Explicações

rake db:schema:load configurará o esquema conforme fornecido no arquivo schema.rb . Isso é útil para uma nova instalação do aplicativo, já que não demora tanto quanto o db:migrate

Nota importante, db:schema:load irá apagar dados no servidor.

rake db:migrate faz alterações no esquema existente. É como criar versões do esquema. db:migrate procurará em db/migrate/ por qualquer arquivo ruby ​​e executará as migrações que ainda não foram executadas, começando pelas mais antigas. O Rails sabe qual arquivo é o mais antigo observando o registro de data e hora no início do nome do arquivo de migração. db:migrate vem com um benefício que os dados também podem ser colocados no banco de dados. Esta não é uma boa prática. É melhor usar o rake db:seed para adicionar dados.

rake db:migrate fornece tarefas para up , down , etc, que permite comandos como o rake db:rollback e o torna o comando mais útil.

rake db:reset faz um db:drop e db:setup
Ele elimina o banco de dados, cria-o novamente, carrega o esquema e inicializa com os dados iniciais

Parte relevante dos comandos de github.com/rails/rails/blob/master/activerecord/lib/…

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

Tanto quanto eu entendo, ele vai soltar o seu banco de dados e recriá-lo com base no seu db/schema.rb . É por isso que você precisa ter certeza de que seu arquivo schema.rb esteja sempre atualizado e sob controle de versão.


  • db: migrar execuções (únicas) migrações que ainda não foram executadas.
  • db: create cria o banco de dados
  • db: drop exclui o banco de dados
  • db: schema: load cria tabelas e colunas dentro do banco de dados (existente) após schema.rb

  • db: setup faz db: create, db: esquema: load, db: seed

  • db: reset faz db: drop, db: setup

Normalmente, você usaria db: migrate depois de fazer alterações no esquema por meio de novos arquivos de migração (isso só faz sentido se já houver dados no banco de dados). db: schema: load é usado quando você configura uma nova instância do seu aplicativo.

Espero que isso ajude.

ATUALIZAÇÃO para trilhos 3.2.12:

Acabei de verificar a fonte e as dependências são assim agora:

  • db: create cria o banco de dados para o env atual
  • db: create: all cria os bancos de dados para todos os envs
  • db: drop descarta o banco de dados para o env atual
  • db: drop: all descarta os bancos de dados de todos os envs
  • db: migrate executa migrações para o env atual que ainda não foram executados
  • db: migrate: up executa uma migração específica
  • db: migrate: down reverte uma migração específica
  • db: migrate: status mostra o status atual da migração
  • db: rollback reverte a última migração
  • db: forward avança a versão atual do esquema para a próxima
  • db: seed (apenas) executa o arquivo db / seed.rb
  • db: schema: load carrega o esquema no banco de dados do env atual
  • db: schema: dump copia o esquema do env atual (e parece também criar o banco de dados)

  • db: setup executa db: schema: load, db: seed

  • db: reset executa db: drop db: setup
  • bd: migrate: redo runs (db: migrate: down db: migrate: up) ou (db: rollback db: migrate) dependendo da migração especificada
  • db: migrate: redefinir execuções db: drop db: create db: migrate

Para mais informações, por favor, dê uma olhada em https://github.com/rails/rails/blob/v3.2.12/activerecord/lib/active_record/railties/databases.rake (para Rails 3.2.x) e https://github.com/rails/rails/blob/v4.0.5/activerecord/lib/active_record/railties/databases.rake (para Rails 4.0.x)





rake