Existe uma maneira fácil de executar uma única migração? Não quero migrar para uma determinada versão, apenas quero executar uma versão específica.
Existe uma maneira fácil de executar uma única migração? Não quero migrar para uma determinada versão, apenas quero executar uma versão específica.
Respostas:
Você pode simplesmente executar o código diretamente do arquivo ruby:
rails console
>> require "db/migrate/20090408054532_add_foos.rb"
>> AddFoos.up
Nota: as versões mais recentes dos trilhos podem exigir, em AddFoos.new.up
vez deAddFoos.up
.
Uma maneira alternativa (sem IRB) que depende do fato de exigir retorna uma matriz de nomes de classes:
script/runner 'require("db/migrate/20090408054532_add_foos.rb").first.constantize.up'
Observe que, se você fizer isso, provavelmente não atualizará a schema_migrations
tabela, mas parece que é isso que você deseja.
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
entãoAddFoos.new.up
change
em vez de up
e down
, você vai precisar executarAddFoos.new.migrate(:up)
AddFoos.new.change
Supondo uma versão bastante recente do Rails, você sempre pode executar:
rake db:migrate:up VERSION=20090408054532
Onde version é o registro de data e hora no nome do arquivo da migração.
Edit: Em algum momento nos últimos 8 anos (não sei qual versão), o Rails adicionou verificações que impedem a execução, se já tiver sido executada. Isso é indicado por uma entrada na schema_migrations
tabela. Para executá-lo novamente, basta executar rake db:migrate:redo VERSION=20090408054532
.
rake db:migrate:down VERSION=XXX
Se você deseja executar uma migração específica , faça
$ rake db:migrate:up VERSION=20080906120000
Se você deseja executar migrações várias vezes , faça
# use the STEP parameter if you need to go more than one version back
$ rake db:migrate:redo STEP=3
Se você deseja executar uma única migração várias vezes, faça
# this is super useful
$ rake db:migrate:redo VERSION=20080906120000
(você pode encontrar o número da versão no nome do arquivo da sua migração)
Editar: Você também pode simplesmente renomear seu arquivo de migração, por exemplo:
20151013131830_my_migration.rb
-> 20151013131831_my_migration.rb
Em seguida, migre normalmente, isso tratará a migração como uma nova (útil se você desejar migrar para um ambiente remoto (como armazenamento temporário) no qual você tem menos controle.
Editar 2 : você também pode apenas adicionar a entrada de migração no banco de dados. Por exemplo:
rails_c> q = "delete from schema_migrations where version = '20151013131830'"
rails_c> ActiveRecord::Base.connection.execute(q)
rake db:migrate
executará novamente o up
método das migrações com armas nucleares.
Se você implementou um change
método como este:
class AddPartNumberToProducts < ActiveRecord::Migration
def change
add_column :products, :part_number, :string
end
end
Você pode criar uma instância da migração e executar migrate(:up)
ou migrate(:down)
em uma instância, assim:
$ rails console
>> require "db/migrate/20090408054532_add_part_number_to_products.rb"
>> AddPartNumberToProducts.new.migrate(:down)
up
e down
.
Estas são as etapas para executar novamente este arquivo de migração "20150927161307_create_users.rb"
Copie e cole a classe que está nesse arquivo no console.
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps null: false end
end
end
end
Crie uma instância da classe CreateUsers
:c1 = CreateUsers.new
change
dessa instância:c1.change
require "./db/migrate/20150927161307_create_users.rb"
vez de copiar e colar. Você pode executar a classe da mesma maneira instanciando e chamando o método definido na classe CreateUsers.new.change
.
Como rails 5
você também pode usar em rails
vez derake
Trilhos 3 - 4
# < rails-5.0
rake db:migrate:up VERSION=20160920130051
Trilhos 5
# >= rails-5.0
rake db:migrate:up VERSION=20160920130051
# or
rails db:migrate:up VERSION=20160920130051
rails db:migrate VERSION=20160920130051
Se você está tendo problemas com os caminhos, pode usar
require Rails.root + 'db/migrate/20090408054532_add_foos.rb'
Observe que, em vez de script/runner
, você pode precisar usar rails runner
em novos ambientes de trilhos.
Se você deseja executá-lo no console, é isso que você está procurando:
$ rails console
irb(main)> require "#{Rails.root.to_s}/db/migrate/XXXXX_my_migration.rb"
irb(main)> AddFoo.migrate(:up)
Eu tentei as outras respostas, mas exigir sem Rails.root
não funcionou para mim.
Além disso, .migrate(:up)
parte força a migração a ser executada novamente, independentemente de já ter sido executada ou não. Isso é útil para quando você já executou uma migração, meio que a desfez ao mexer com o banco de dados e deseja uma solução rápida para recuperá-la.
Parece que, pelo menos na versão mais recente do Rails (5.2 no momento da redação), há mais uma maneira de filtrar as migrações sendo executadas. Pode-se passar um filtro em uma SCOPE
variável de ambiente que seria usada para selecionar arquivos de migração.
Supondo que você tenha dois arquivos de migração 1_add_foos.rb
e 2_add_foos.run_this_one.rb
executando
SCOPE=run_this_one rails db:migrate:up
irá selecionar e executar apenas 2_add_foos.run_this_one.rb
. Lembre-se de que todos os arquivos de migração correspondentes ao escopo serão executados.