Respostas:
rake db:migrate:redo VERSION=xxxxxxx
, mas isso executará o down
e, em seguida, a up
etapa. Você pode fazer isso em conjunto com a observação da etapa de descida temporariamente.
rake -T
.
db:test:prepare
também não aparece nessa lista. Deus, estou atrasado para a festa.
rake db:migrate:up VERSION=my_version
pode não fazer nada , porque a tabela schema_migrations ainda diz que foi executada. Na mesma situação rake db:migrate:redo VERSION=my_version
pode falhar porque não pode largar a mesa. Neste caso, comente o down
método na migração temporariamente e execute novamenterake db:migrate:redo...
rake db:migrate:up VERSION=1234567890
da mesma forma rake db:migrate:down
para eliminar uma migração específica. Você pode obter uma lista de tarefas de rake disponíveis com rake -T
.
VERSION
mencionado aqui é o valor inteiro no início de cada um de seus arquivos de migração (que é apenas o carimbo de data / hora de quando foi criado). Por exemplo VERSION=20150720023630
,.
VERSION
é apenas uma variável de ambiente para que possa vir primeiro no comando ou mesmo configurada antes do comando:VERSION=1234567890 rake db:migrate:up
Tive que executar uma única migração que mudou e precisava ser executada novamente, independentemente de todas as outras migrações. Abra o console e faça o seguinte:
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
Mais útil, isso poderia ser colocado em uma tarefa de rake etc.
change
, execute em seu YourMigrations.migrate(:up)
lugar (ou :down
também!)
require "#{Rails.root}/db/migrate/your_migrations.rb"
rake db:migrate VERSION=20098252345
tente.
VERSION
é apenas uma variável de ambiente para que possa vir primeiro no comando ou mesmo configurada antes do comando:VERSION=20098252345 rake db:migrate
Expandir a resposta por korch acima require
não funcionou para mim, mas load
funcionou. Para ser concreto, para o arquivo de migração:
class ChangeMinQuantityToRaces < ActiveRecord::Migration
def change
change_column :races, :min_quantity, :integer, :default => 0
end
end
no console digitando
> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
> ChangeMinQuantityToRaces.new.change
trabalhou para mim.
> Race.new.min_quantity # => 0
Isso foi para ruby 1.9.3p484 (2013-11-22 revisão 43786) [x86_64-linux] e Rails 3.2.13.
Adicionando meus 2 centavos a isso porque tive o mesmo problema:
Se você realmente deseja executar uma migração novamente sem criar uma nova, você pode fazer o seguinte:
rails dbconsole -p
devdb=# delete from public.schema_migrations where version = '20150105181157';
E o rails "esquecerá" que executou a migração para 20150105181157. Agora, quando você executar db: migrate, ele executará novamente.
Isso quase sempre é uma má ideia. A única instância em que pode fazer sentido é se você tiver um branch de desenvolvimento e ainda não tiver desenvolvido sua migração e quiser adicionar algumas coisas a ela no desenvolvimento. Mas, mesmo assim, é melhor fazer sua migração bidirecional para que você possa reverter corretamente e tentar repetidamente.
Deve haver uma maneira de executar a classe de migração por meio do console. Não consigo fazer com que o código de migração seja reconhecível.
No entanto, como os comentários indicam, é preferível executar as migrações em ordem. Usar:
rake db:migrate VERSION=##########
Copie e cole seu código na migração para script / console?
Eu tenho um método utilitário que torna isso muito fácil no desenvolvimento. Acho que isso me ajuda a evitar a criação de muitas migrações - normalmente, modifico as migrações até que sejam implantadas.
http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/
Eu uso essa técnica no desenvolvimento quando mudo uma quantidade significativa de migração, e não quero migrar uma tonelada e perder nenhum dado ao longo do caminho (especialmente quando estou importando dados legados que levam muito tempo que Não quero ter que reimportar novamente).
Isso é 100% hackeado e eu definitivamente não recomendaria fazer isso na produção, mas funcionará:
STEP=n
argumento paradb:migrate
(onden
é o número de migrações a serem executadas, assim como existedb:rollback
) - então você poderia fazerrake db:migrate STEP=1
ourake db:migrate STEP=2
, etc.