Diferença entre rake db: migrate db: reset e db: schema: load

619

A diferença entre rake db:migratee rake db:reseté bem clara na minha cabeça. O que eu não entendo é o quão rake db:schema:loaddiferente dos dois primeiros.

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 meu entendimento deu errado.

Gaurav Agarwal
fonte
10
Será que rake --tasksajuda?
zx1986
Você deve verificar este blog. jacopretorius.net/2014/02/...
Bishisht Bhatta
Sua compreensão de rake db:migrateestá correta, mas sua compreensão rake db:resetestá errada. Veja a resposta mais alta, de moritz.
precisa
1
BTW, a partir das Rails 5, esses comandos podem ser invocados como rails db:migrate, rails db:reset, rails db:schema:load. Veja stackoverflow.com/questions/38403533/…
Purplejacket

Respostas:

1303
  • db: migrar executa migrações (únicas) 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 no banco de dados (existente) após schema.rb

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

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

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

Espero que ajude.


UPDATE 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 ambiente atual
  • db: create: all cria os bancos de dados para todos os envs
  • db: drop descarta o banco de dados para o ambiente atual
  • db: drop: all descarta os bancos de dados para todos os envs
  • db: migrate executa migrações para o ambiente atual que ainda não foi executado
  • db: migrate: up executa uma migração específica
  • db: migrate: 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 (somente) executa o arquivo db / seed.rb
  • db: schema: load carrega o esquema no banco de dados do ambiente atual
  • db: schema: dump despeja o esquema do ambiente atual (e parece criar o db também)

  • db: setup é executado db: schema: load, db: seed

  • db: reset executa db: drop db: instalação
  • db: migrate: redo executa (db: migrate: down db: migrate: up) ou (db: rollback db: migrate) dependendo da migração especificada
  • db: migrate: reset executa db: drop db: create db: migrate

Para obter mais informações, consulte 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 / database.rake (para Rails 4.0.x)

Moritz
fonte
16
Aqui está o arquivo com as respostas :) - github.com/rails/rails/blob/master/activerecord/lib/…
cutalion
3
@cutation: db: setup certamente não executa db: migrate, porque seria muito frágil para executar todas as migrações apenas para uma instalação de db (é para isso que serve schema.rb).
Moritz
2
Estou executando o db: reset e está semeando meu db. Por que poderia ser?
Alejandro Riedel
db: setup também é executado db:createse necessário. Pelo menos a partir dos trilhos 4.0.2.
Dan
O Rails 4 será executado rake db:migrateao chamar rake db:setupse houver migrações pendentes, mas não será executado.
Pooyan Khosravi
24

TLDR

Usar

  • rake db:migrate Se você quiser fazer alterações no esquema
  • rake db:resetSe você deseja descartar o banco de dados, recarregue o esquema de schema.rbe repita o banco de dados
  • rake db:schema:loadSe você deseja redefinir o banco de dados para o esquema, conforme fornecido em schema.rb(Isso excluirá todos os dados)

Explicações

rake db:schema:loadirá configurar o esquema conforme fornecido no schema.rbarquivo. Isso é útil para uma nova instalação do aplicativo, pois não leva tanto tempo quantodb:migrate

Nota importante, db:schema:loadvai eliminar dados no servidor.

rake db:migratefaz alterações no esquema existente. É como criar versões do esquema. db:migrateprocurará db/migrate/por arquivos ruby ​​e executará as migrações que ainda não foram executadas, começando pela mais antiga. 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:migratevem com o benefício de que os dados também podem ser colocados no banco de dados. Na verdade, isso não é uma boa prática. É melhor usar rake db:seedpara adicionar dados.

rake db:migratefornece tarefas para cima , para baixo , etc., que permitem comandos como rake db:rollbacke o tornam o comando mais útil.

rake db:resetfaz um db:dropedb:setup
Ele deixa o banco de dados, criá-la novamente, carrega o esquema, e inicializa com os dados de sementes

Parte relevante dos comandos do database.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
fonte
Portanto, se você criar seu esquema de produção usando db: schema: load (criado a partir de uma série de migrações anteriores), saberá quais migrações (aquelas que participaram da criação do schema.rb inicial) não precisam ser executadas no futuro invocações do db: migrate?
CanadaIT
2

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

Simon Bagreev
fonte
0

Você pode simplesmente olhar nas tarefas do Active Record Rake, pois é onde acredito que elas moram como neste arquivo. https://github.com/rails/rails/blob/fe1f4b2ad56f010a4e9b93d547d63a15953d9dc2/activerecord/lib/active_record/tasks/database_tasks.rb

O que eles fazem é a sua pergunta, certo?

Isso depende de onde eles vêm e este é apenas um exemplo para mostrar que eles variam dependendo da tarefa. Aqui temos um arquivo diferente, cheio de tarefas.

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

que tem essas tarefas.

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

Isso pode não responder à sua pergunta, mas pode lhe dar algumas dicas sobre como prosseguir e analisar a fonte, especialmente os arquivos e tarefas de rake. Como eles fazem um bom trabalho em ajudá-lo a usar os trilhos, eles nem sempre documentam bem o código. Todos nós poderíamos ajudar lá, se soubermos o que deve fazer.

Douglas G. Allen
fonte
Cite partes relevantes do artigo, caso ele seja removido. Não sugira fazer algo sem explicar o porquê.
PhilT
0

ATUALIZADO para Rails 5:

db:create- Cria o banco de dados para o ambiente RAILS_ENV atual . Se RAILS_ENV não for especificado, o padrão será o banco de dados de desenvolvimento e teste.

db:create:all - Cria o banco de dados para todos os ambientes.

db:drop- Elimina o banco de dados para o ambiente RAILS_ENV atual . Se RAILS_ENV não for especificado, o padrão será o banco de dados de desenvolvimento e teste.

db:drop:all - Elimina o banco de dados para todos os ambientes.

db:migrate- Executa migrações para o ambiente atual que ainda não foi executado. Por padrão, ele executará migrações apenas no ambiente de desenvolvimento.

db:migrate:redo- Executa db: migrate: down e db: migrate: up ou db: migrate: rollback e db: migrate: up, dependendo da migração especificada.

db:migrate:up - Executa a VERSÃO de migração fornecida.

db:migrate:down - Executa o down para a VERSÃO de migração especificada.

db:migrate:status - Exibe o status atual da migração.

db:migrate:rollback - Reverte a última migração.

db:version - Imprime a versão atual do esquema.

db:forward - Envia o esquema para a próxima versão.

db:seed- Executa o arquivo db / seeds.rb .

db:schema:loadRecria o banco de dados do arquivo schema.rb .

db:schema:dumpDespeja o esquema do ambiente atual em db / schema.rb .

db:structure:load- Recria o banco de dados do arquivo structure.sql .

db:structure:dump- Despeja o esquema do ambiente atual em db / structure.sql . (Você pode especificar outro arquivo com SCHEMA=db/my_structure.sql)

db:setupExecuta db: create , db: schema: load e db: seed .

db:resetExecuta db: drop e db: setup . db:migrate:reset- Executa db: drop , db: create e db: migrate .

db:test:prepare- Verifique as migrações pendentes e carregue o esquema de teste. (Se você executar o rake sem argumentos, isso será feito por padrão.)

db:test:clone - Recrie o banco de dados de teste a partir do esquema de banco de dados do ambiente atual.

db:test:clone_structure- Semelhante ao db: test: clone , mas garantirá que o banco de dados de teste tenha a mesma estrutura, incluindo conjuntos de caracteres e agrupamentos, que o banco de dados do ambiente atual.

db:environment:set- Defina o ambiente RAILS_ENV atual na tabela ar_internal_metadata . (Usado como parte da verificação do ambiente protegido.)

db:check_protected_environments- Verifica se uma ação destrutiva pode ser executada no ambiente RAILS_ENV atual . Usado internamente ao executar uma ação destrutiva, como db: drop ou db: schema: load .

Ваня Скоцик
fonte