2012-04-28 20 views
22

W jaki sposób przeprowadzasz migracje baz danych za pomocą Meteora? Z Ruby on Rails jest ActiveRecord :: Migration. Czy w Meteorcie istnieje równoważny mechanizm?Meteor jak przeprowadzić migracje baz danych?

Na przykład tworzę aplikację z niektórymi danymi użytkownika. Przechowuję dane w Mongo przy użyciu formatu JSON. Aplikacja zmienia się, a schemat bazy danych JSON musi się zmienić. Mogę napisać metodę migracji, aby zmienić schemat, ale chcę tylko, aby to działało, jeśli baza danych serwera jest nieaktualna.

Odpowiedz

35

Nie ma w tym nic wbudowanego. To, co zrobiłem na razie, jest podobne do działania Rails, ale jako część uruchamiania zamiast oddzielnego zadania. Najpierw utwórz plik Meteor.Collection o nazwie Migracje, a następnie dla każdej dyskretnej migracji utwórz funkcję w podkatalogu server uruchamianym podczas uruchamiania. Powinien uruchamiać migrację tylko wtedy, gdy jeszcze nie był uruchamiany i powinien oznaczyć migrację w kolekcji Migracje po jej zakończeniu.

// database migrations 
Migrations = new Meteor.Collection('migrations'); 

Meteor.startup(function() { 
    if (!Migrations.findOne({name: "addFullName"})) { 
    Users.find().forEach(function (user) { 
     Users.update(user._id, {$set: {fullname: users.firstname + ' ' + users.lastname}}); 
    }); 
    Migrations.insert({name: "addFullName"}); 
    } 
}); 

Można rozszerzyć tę technikę do wsparcia w dół migracje (poszukaj istnienia danej migracji i odwrócić go), wymusić porządek na migracje i podzielić każdy migrację do osobnego pliku, jeśli chciałeś.

Warto pomyśleć o inteligentnym pakiecie do automatyzacji tego.

+0

Mogę ewentualnie uzyskać motywację do zrobienia inteligentnego pakietu z tą logiką. To wciąż lepsze niż niejasna metoda meteorytów. – wizonesolutions

+0

Jeśli masz więcej niż jeden serwer działający na tej samej bazie danych (wiele serwerów sieciowych lub mikroserwisów), możesz napotkać problemy, gdy wszystkie 5 serwerów uruchomi to samo zapytanie. Ten pakiet wydaje się używać [mechanizmu blokującego] (https://github.com/percolatestudio/meteor-migrations/blob/master/migrations_server.js#L159) –

4

Stworzyłem inteligentny pakiet dla tego przypadku użycia.
Zobacz https://atmosphere.meteor.com/package/migrations

+5

Istnieje również https://github.com/percolatestudio/meteor- migracje, które wydaje mi się mieć czystszy projekt niż https://github.com/rantav/meteor-migrations. –

5

Jak Aram wskazał już w komentarzu, p ercolate:migrations pakiet daje ci to, czego potrzebujesz. Próbka

Migrations.add({ 
    version: 1, 
    name: 'Adds pants to some people in the db.', 
    up: function() {//code to migrate up to version 1} 
    down: function() {//code to migrate down to version 0} 
}); 

Migrations.add({ 
    version: 2, 
    name: 'Adds a hat to all people in the db who are wearing pants.', 
    up: function() {//code to migrate up to version 2} 
    down: function() {//code to migrate down to version 1} 
});