2012-04-28 5 views
22

Как вы выполняете миграцию базы данных с помощью Meteor? С Ruby on Rails есть ActiveRecord :: Migration. Есть ли эквивалентный механизм в Метеор?Метеор как выполнять миграции баз данных?

Например, я создаю приложение с некоторыми пользовательскими данными. Я храню данные в Mongo, используя формат JSON. Приложение изменилось, и схема базы данных JSON должна измениться. Я могу написать метод миграции для изменения схемы, однако я хочу, чтобы это было выполнено, если база данных сервера устарела.

ответ

35

Для этого ничего не создано. То, что я сделал сейчас, похоже на то, как работает Rails, но как часть запуска вместо отдельной задачи. Сначала создайте Meteor.Collection с именем Migrations, а затем для каждой дискретной миграции создайте функцию под подкаталогом server, которая запускается при запуске. Он должен выполнить только миграцию, если она еще не выполнялась раньше, и она должна отмечать миграцию в коллекции Migrations после ее завершения.

// 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"}); 
    } 
}); 

Вы можете расширить эту технику, чтобы поддержать вниз миграции (обратите внимание на существование данной миграции и повернуть его вспять), соблюдение порядка сортировки по миграции, и разделить каждую миграцию в отдельный файл, если вы хотите.

Было бы интересно подумать о смарт-пакете для автоматизации этого.

+0

В конце концов, я мог бы получить мотивацию сделать интеллектуальный пакет с этой логикой. Это все еще лучше, чем неясный метод Метеор. – wizonesolutions

+0

Если у вас несколько серверов, работающих в одной базе данных (несколько веб-серверов или микросервисов), вы можете столкнуться с проблемами, когда 5 серверов выполняют один и тот же запрос. Этот пакет, похоже, использует механизм блокировки (https://github.com/percolatestudio/meteor-migrations/blob/master/migrations_server.js#L159) –

4

Я создал смарт-пакет для этого прецедента.
См https://atmosphere.meteor.com/package/migrations

+5

Существует также https://github.com/percolatestudio/meteor- миграций, которые, как мне кажется, имеют более чистый дизайн, чем https://github.com/rantav/meteor-migrations. –

5

Как Арам указал уже в комментарии, с ercolate:migrations пакет дает вам то, что вам нужно. Образец

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} 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^