Próbuję przeprowadzić tylko jedną migrację z całej paczki w mojej aplikacji railsowej. Jak mogę to zrobić? Nie chcę uruchamiać żadnej migracji przed ani po niej. Dzięki.
Odpowiedzi:
rake db:migrate:redo VERSION=xxxxxxx
, ale spowoduje to uruchomienie kroku, down
a następnie up
. Możesz to zrobić w połączeniu z tymczasowym komentowaniem kroku w dół.
rake -T
.
db:test:prepare
również nie pojawia się na tej liście. Boże, spóźniłem się na przyjęcie.
rake db:migrate:up VERSION=my_version
może nic nie zrobić , ponieważ tabela schema_migrations nadal mówi, że została uruchomiona. W tej samej sytuacji rake db:migrate:redo VERSION=my_version
może się nie powieść, ponieważ nie może usunąć tabeli. W takim przypadku down
tymczasowo zakomentuj metodę w migracji i uruchom ponownierake db:migrate:redo...
rake db:migrate:up VERSION=1234567890
podobnie, rake db:migrate:down
aby wyłączyć określoną migrację. Możesz uzyskać listę dostępnych zadań rake za pomocą rake -T
.
VERSION
Wspomniano tutaj jest wartość całkowitą na początku każdego z plików migracji (co jest tylko znacznik czasu, kiedy został utworzony). Na przykład VERSION=20150720023630
.
VERSION
jest to tylko zmienna środowiskowa, więc może być pierwsza w poleceniu lub nawet ustawiona przed poleceniem:VERSION=1234567890 rake db:migrate:up
Musiałem przeprowadzić pojedynczą migrację, która uległa zmianie i musiała zostać uruchomiona ponownie niezależnie od wszystkich innych migracji. Uruchom konsolę i zrób to:
>> require 'db/migrate/your_migrations.rb'
=> ["YourMigrations"]
>> YourMigrations.up
=> etc... as the migration runs
>> YourMigration.down
Bardziej przydatne może być zadanie rake itp.
change
, uruchom YourMigrations.migrate(:up)
zamiast tego (lub :down
też!)
require "#{Rails.root}/db/migrate/your_migrations.rb"
rake db:migrate VERSION=20098252345
spróbować.
VERSION
to tylko zmienna środowiskowa, więc może być pierwsza w poleceniu lub nawet ustawiona przed poleceniem:VERSION=20098252345 rake db:migrate
rake db:migrate:redo version='xxxx'
Pamiętaj, aby umieścić cudzysłów wokół xxxx, xxxx to sygnatura czasowa (lub identyfikator migracji) migracji.
Możesz sprawdzić sygnatury czasowe (identyfikator migracji) poprzednich migracji wykonanych za pomocą
rake db:migrate:status
Rozszerzanie odpowiedzi przez korch powyżej, require
nie działało dla mnie, ale działało load
. Konkretnie, dla pliku migracji:
class ChangeMinQuantityToRaces < ActiveRecord::Migration
def change
change_column :races, :min_quantity, :integer, :default => 0
end
end
w wpisywaniu konsoli
> load 'db/migrate/30130925110821_change_min_quantity_to_races.rb'
> ChangeMinQuantityToRaces.new.change
pracował dla mnie.
> Race.new.min_quantity # => 0
Było to dla Ruby 1.9.3p484 (2013-11-22, wersja 43786) [x86_64-linux] i Rails 3.2.13.
Dodając do tego moje 2 ¢, ponieważ napotkałem ten sam problem:
Jeśli absolutnie chcesz ponownie przeprowadzić migrację bez tworzenia nowej, możesz wykonać następujące czynności:
rails dbconsole -p
devdb=# delete from public.schema_migrations where version = '20150105181157';
Railsy „zapomną”, że przeprowadziły migrację dla 20150105181157. Teraz, kiedy uruchomisz db: migrate, uruchomi się ponownie.
Prawie zawsze jest to jednak zły pomysł. Jedynym przypadkiem, w którym może to mieć sens, jest sytuacja, w której masz gałąź programistyczną, a nie przygotowałeś jeszcze migracji i chcesz dodać do niej kilka rzeczy w trakcie opracowywania. Ale nawet wtedy lepiej jest przeprowadzić migrację dwukierunkową, aby można było poprawnie wycofać i wielokrotnie ponawiać.
Musi istnieć sposób na uruchomienie klasy migracji za pośrednictwem konsoli. Nie mogę uzyskać rozpoznawalności kodu migracji.
Jednak, jak wskazują komentarze, preferowane jest uruchamianie migracji w kolejności. Posługiwać się:
rake db:migrate VERSION=##########
Skopiować i wkleić kod w migracji do skryptu / konsoli?
Mam metodę narzędziową, która bardzo ułatwia programowanie. Uważam, że pomaga mi to uniknąć tworzenia zbyt wielu migracji - zwykle modyfikuję migracje, dopóki nie zostaną wdrożone.
http://fullware.net/index.php/2011/05/26/easily-load-rails-migrations-for-console-execution/
Używam tej techniki w programowaniu, gdy zmieniam migrację w znacznej ilości i nie chcę migrować w dół tony i tracić żadnych danych po drodze (zwłaszcza gdy importuję starsze dane, co zajmuje dużo czasu, Nie chcę ponownie importować).
To jest w 100% hacking i zdecydowanie nie polecałbym tego na produkcji, ale wystarczy:
STEP=n
argument dodb:migrate
(gdzien
jest liczba migracji do uruchomienia, tak jak w przypadkudb:rollback
) - wtedy możesz zrobićrake db:migrate STEP=1
lubrake db:migrate STEP=2
itd.