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.
267
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:
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:
Observe que, se você fizer isso, provavelmente não atualizará a
schema_migrations
tabela, mas parece que é isso que você deseja.fonte
AddFoos.new.up
require "./db/migrate/db/migrate/20090408054532_add_foos.rb"
entãoAddFoos.new.up
change
em vez deup
edown
, você vai precisar executarAddFoos.new.migrate(:up)
AddFoos.new.change
Supondo uma versão bastante recente do Rails, você sempre pode executar:
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 executarrake db:migrate:redo VERSION=20090408054532
.fonte
rake db:migrate:down VERSION=XXX
Se você deseja executar uma migração específica , faça
Se você deseja executar migrações várias vezes , faça
Se você deseja executar uma única migração várias vezes, faça
(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:
rake db:migrate
executará novamente oup
método das migrações com armas nucleares.fonte
Se você implementou um
change
método como este:Você pode criar uma instância da migração e executar
migrate(:up)
oumigrate(:down)
em uma instância, assim:fonte
up
edown
.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.
Crie uma instância da classe
CreateUsers
:c1 = CreateUsers.new
change
dessa instância:c1.change
fonte
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 classeCreateUsers.new.change
.Como
rails 5
você também pode usar emrails
vez derake
Trilhos 3 - 4
Trilhos 5
fonte
rails db:migrate VERSION=20160920130051
Se você está tendo problemas com os caminhos, pode usar
fonte
Método 1 :
Método 2:
No console do Rails 1. Copie e cole a classe de migração no console (por exemplo, add_name_to_user.rb) 2. Em seguida, no console, digite o seguinte
Está feito!!
fonte
Observe que, em vez de
script/runner
, você pode precisar usarrails runner
em novos ambientes de trilhos.fonte
Se você deseja executá-lo no console, é isso que você está procurando:
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.fonte
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
e2_add_foos.run_this_one.rb
executandoirá 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.fonte