2013-09-02 12 views
18

Pracuję nad aplikacją, która jest już wdrożona w niektórych systemach testowych i pomostowych oraz na różnych stacjach roboczych programistów. Muszę dodać dodatkowe dane referencyjne, ale nie wiem, jak je dodać.Jak dodać nowe dane źródłowe do istniejącej bazy danych szyn

Większość porad mówi o użyciu seed.rb, jednak rozumiem, że jest to uruchamiane tylko raz, gdy aplikacja jest początkowo wdrażana. Ponieważ nie chcemy przebudowywać baz testowych i testowych, abyśmy mogli dodać 1 wiersz danych referencyjnych, czy istnieje inny sposób dodawania danych?

Myślę o używaniu migracji do bazy danych, czy to jest właściwe podejście?

Dzięki

+2

Możesz uruchomić 'seed.rb' tyle razy, ile chcesz, to tylko zwykły plik skryptowy z rubinem ... Chociaż pamiętaj, że jeśli wcześniej go uruchomiłeś, a uruchomisz go ponownie, otrzymasz duplikaty. W twoim przypadku, jeśli chcesz po prostu dodać wiersz danych, a następnie "rake task" lub użyć skryptu runner http://guides.rubyonrails.org/command_line.html#rails-runner Nie uważam, że migracja jest odpowiednia dla to jednak. – j03w

Odpowiedz

26

Struktura pliku seed.rb umożliwia bieżące tworzenie i aktualizowanie danych. Nie musisz ograniczać się do uruchamiania pliku źródłowego tylko raz i jeśli uważasz, że jest on używany tylko do początkowego wdrożenia, stracisz elastyczność, jaką może zaoferować w ustawianiu danych referencyjnych.

Plik nasiona są tylko rubin, dzięki czemu można zrobić rzeczy jak:

user = User.find_or_initialize_by(email: '[email protected]') 
user.name = 'Bob' 
user.password = 'secret' 
user.role = 'manager' 
user.save! 

To stworzy nowe dane, jeśli nie istnieje lub zaktualizować dane, jeżeli stwierdzi niektórych.

Jeśli prawidłowo tworzysz strukturę pliku źródłowego, możesz także tworzyć i aktualizować zależne obiekty.

Zalecam użycie funkcji składowania typu "bang", aby zapewnić wyjątki w przypadku, gdy obiekt nie może zostać zapisany. Jest to najłatwiejsza metoda debugowania nasion.

Używam seedbank gem, aby zapewnić większą strukturę moich danych źródłowych, w tym dane dotyczące ustawień dla poszczególnych środowisk, nasion zależnych i innych.

Nie polecam używania migracji danych nasion. Brak jest elastyczności (w jaki sposób można docelowo kierować dane źródłowe tylko do jednego środowiska) i nie można w żaden sposób utworzyć zestawu danych wielokrotnego użytku, który można uruchomić w dowolnym momencie w celu odświeżenia określonego środowiska. Miałbyś także zestaw migracji, które nie mają odniesienia do twojego schematu i będziesz musiał utworzyć nowe migracje za każdym razem, gdy chcesz wygenerować nowe lub zmienić bieżące dane.

+0

@ nmott- Po dodaniu powyższej treści, czy powinienem wykonać rake db: seed? Jeśli to mi się podoba, istniejące już są ponownie zaludnione? – Sam

+2

@Jsd Tak, 'rake db: seed' załaduje plik źródłowy i jeśli dany model już istnieje, to znajdzie rekord i zastąpi go danymi w pliku źródłowym. Oznacza to, że możesz zmieniać dane w swojej aplikacji i korzystać z pliku źródłowego, aby regularnie odświeżać go do standardowego zestawu danych. – nmott

+0

Wygląda jednak na to, że w końcu stanie się dość rozdęty. –

2

Można użyć migracji, ale nie jest to najbezpieczniejsza opcja masz. Załóżmy na przykład, że do tablicy zostanie dodany rekord podczas migracji, a następnie w przyszłości zmienisz schemat tej tabeli. Kiedy zainstalujesz aplikację gdzieś, nie będziesz mógł uruchomić rake db:migrate.

Nasiona są zawsze wskazane, ponieważ rake db:seed można uruchomić na całkowicie zmigrowanym schemacie.

Jeśli chodzi tylko o płytę, przejdź do konsoli szyn.

1

Najlepiej użyć metody idempotent takiego w seed.rb lub innego zadania o nazwie przez seed.rb:

Contact.find_by_email("[email protected]") || Contact.create(email: "[email protected]", phone: "202-291-1970", created_by: "System") 
# This saves you an update to the DB if the record already exists. 

lub podobne do @ nmott użytkownika:

Contact.find_or_initialize_by_email("[email protected]").update_attributes(phone: "202-291-1970", created_by: "System") 
# this performs an update regardless, but it may be useful if you want to reset your data. 

lub użyć zamiast assign_attributes z update_attributes, jeśli chcesz przypisać wiele atrybutów przed zapisaniem.

0

zrobiłem coś takiego w seed.rb

users_list = [ 
    {id: 1, name: "Diego", age: "25"}, 
    {id: 2, name: "Elano", age: "27"} 
] 

while !users_list.empty? do 
    begin 
    User.create(users_list) 
    rescue 
    users_list = users_list.drop(1) #removing the first if the id already exist. 
    end 
end 

Jeśli pozycja na liście z podanym identyfikatorze już istnieje zwróci wyjątek, a następnie usuwamy ten przedmiot i spróbować jeszcze raz, aż tablica users_list jest pusta.

W ten sposób nie trzeba przeszukiwać każdego obiektu przed włączeniem go, ale nie będzie można aktualizować wartości już wstawionych, jak w kodzie @ nmott.

0

Zamiast zmieniać numer seeds.db, którego prawdopodobnie chcesz użyć do rozsiewania nowych baz danych, możesz utworzyć niestandardowe zadanie rake (RailsCast #66 Custom Rake Tasks).

Możesz utworzyć dowolną liczbę zadań prowizji, jak chcesz. Na przykład, powiedzmy, że masz dwa serwery, jeden działający w wersji 1.0 twojej aplikacji, drugi z wersji 1.1 i chcesz uaktualnić zarówno do wersji 1.2. Następnie możesz utworzyć lib/tasks/1-0-to-1-2.rake i lib/tasks`1-1-to-1-2.rake, ponieważ może być potrzebny inny kod w zależności od wersji aplikacji.

1

Używam pliku źródłowego do dodawania instancji do nowych lub istniejących tabel przez cały czas. Moje rozwiązanie jest proste. Po prostu skomentowałem wszystkie inne dane źródłowe w pliku db/seeds.rb, aby tylko nowe dane początkowe były aktywnym kodem. Następnie uruchom bin/rake db:seed.

Powiązane problemy