2008-09-16 16 views
5

Doświadczony z Rails/ActiveRecord 2.1.1rake db: migrate nie wykrywa nowej migracji?

  • utworzyć pierwszą wersję z (na przykład) skryptu ruby ​​\ generują tytułowy produkt rusztowania: opis tekstowy: IMAGE_URL text: String
  • to utworzenie (na przykład) plik migracji nazywa 20080910122415_create_products.rb
  • zastosować migrację z rake db: migrować
  • teraz dodać pole do tabeli produktów ze skryptu ruby ​​\ generować migracji cenę add_price_to_product: standardowy
  • Ten utwórz plik migracji o nazwie 20080910125745_add_price_to_product.rb
  • Jeśli spróbujesz uruchomić program rake db: migrate, to w rzeczywistości przywróci pierwszą migrację, a nie kolejną! Twój stół produktów zostanie zniszczony!
  • Ale jeśli sam prowadził grabie, to powiedziałby ci, że jedna migracja jest w toku

Pls pamiętać, że stosowanie rake db: migrować (raz tabela została zniszczona) będą miały zastosowanie wszystkie migracje w porządku.

Jedyne obejście znalazłem jest, aby określić wersję nowej migracji, jak w:

rake db:migrate version=20080910125745 

Więc zastanawiam się: czy to oczekiwanego nowego zachowania?

Odpowiedz

1

Powinieneś być w stanie wykorzystać

rake db:migrate:up 

zmusić go, aby przejść do przodu, ale wtedy ryzykujesz brakujących przeplatane migracje z innymi ludźmi w zespole

jeśli uruchomić

rake db:migrate 

dwa razy, spowoduje ponowne zastosowanie wszystkich migracji.

Napotykam to samo zachowanie w oknach z SQLite, może to być błąd specyficzny dla takiego środowiska.

Edytuj - Znalazłem, dlaczego. W bazie danych kolei.Zadanie grabie masz następujący kod:

desc "Migrate the database through scripts in db/migrate. Target specific version with VERSION=x. Turn off output with VERBOSE=false." 
task :migrate => :environment do 
    ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true 
    ActiveRecord::Migrator.migrate("db/migrate/", ENV["VERSION"] ? ENV["VERSION"].to_i : nil) 
    Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby 
end 

potem w moich zmiennych środowiskowych mam

echo %Version% #=> V3.5.0f 

w Ruby

ENV["VERSION"] # => V3.5.0f 
ENV["VERSION"].to_i #=>0 not nil ! 

zatem zadaniem natarcia wzywa

ActiveRecord::Migrator.migrate("db/migrate/", 0) 

i w Aktywnym Rekord :: Migrator mamy:

class Migrator#:nodoc: 
    class << self 
    def migrate(migrations_path, target_version = nil) 
     case 
     when target_version.nil?    then up(migrations_path, target_version) 
     when current_version > target_version then down(migrations_path, target_version) 
     else          up(migrations_path, target_version) 
     end 
    end 

Tak, rake db:migrate VERSION=0 jest długa wersja dla rake db:migrate:down

Edit - pójdę zaktualizować błąd latarni ale pełnomocnik Super firma zabrania że mogę podłączyć tam

W międzyczasie możesz spróbować wyzerować wersję przed wywołaniem migracji ...

0

To nie jest oczekiwane zachowanie. Miałem zaproponować zgłoszenie tego błędu jako błąd na latarni, ale widzę, że masz already done so! Jeśli podasz więcej informacji (w tym wersję OS/bazy danych/ruby), przyjrzę się temu.

1

Z szacunkiem nie zgadzam się z Tomem! to jest błąd !! V3.5.0f nie jest poprawną wersją dla migracji rake. Rake nie należy go używać do migracji: w dół, tylko dlatego, rubin zdecydował się uznać, że „V3.5.0f” .to_i 0 ...

grabie powinny głośno skarżą się, że wersja nie jest ważne, tak aby użytkownicy wiedzieli, o co chodzi (między tobą a mną, sprawdzenie, że wersja jest YYYYMMDD sformatowany znacznik czasu przez konwersję na liczbę całkowitą jest nieco lekki)

[Cholerny IE6, który nie pozwoli mi komentować! i nie mogę nie można zmienić w przeglądarce dzięki korporacyjnych]

0

Jean,

dziękuję za swoim dochodzeniu. Masz rację, a właściwie myślę, że odkryłeś poważniejszy błąd, o "błędzie projektowym gatunku".

Co się dzieje, to że prowizja pobierze dowolną wartość przekazaną do wiersza poleceń i zachowa je jako zmienne środowiskowe. Zadania rake, które zostaną ostatecznie wywołane, po prostu wyciągną te wartości ze zmiennej środowiskowej. Kiedy db: migrate queries ENV ["VERSION"], to faktycznie żąda parametru wersji, który ustawiłeś wywołując rake. Kiedy wywołujesz rake db: migrate, nie przekazujesz żadnej wersji.

Ale mamy zmienną środowiskową o nazwie VERSION, która została ustawiona do innych celów przez jakiś inny program (nie mam jeszcze tego). A faceci za rake'em (lub za database.rake) nie wiedzieli, że to się stanie. To błąd w projektowaniu. Przynajmniej mogliby użyć bardziej konkretnych nazw zmiennych, takich jak "RAKE_VERSION" lub "RAKE_PARAM_VERSION" zamiast tylko "VERSION".

Tom, na pewno nie zamknę, ale zredaguję mój raport o błędzie na latarni morskiej, aby odzwierciedlić te nowe odkrycia.

I jeszcze raz dziękuję Jean za pomoc.Wysłałem ten błąd na latarni morskiej, jak 5 dni agao i wciąż nie mam odpowiedzi!

Rollo

Powiązane problemy