2012-04-28 19 views
22

Come si eseguono le migrazioni del database con Meteor? Con Ruby on Rails c'è ActiveRecord :: Migration. Esiste un meccanismo equivalente in Meteor?Meteor come eseguire le migrazioni di database?

Ad esempio, faccio un'app con alcuni dati utente. Sto memorizzando i dati in Mongo usando un formato JSON. L'app cambia e lo schema del database JSON deve essere modificato. Posso scrivere un metodo di migrazione per modificare lo schema, tuttavia, voglio solo che venga eseguito se il database del server non è aggiornato.

risposta

35

Non c'è niente di integrato in questo. Quello che ho fatto io per ora è simile a come funziona Rails, ma come parte dell'avvio invece di un'attività separata. Creare innanzitutto un numero Meteor.Collection denominato Migrazioni, quindi, per ciascuna migrazione discreta, creare una funzione nella sottodirectory server che viene eseguita all'avvio. Dovrebbe eseguire la migrazione solo se non è mai stata eseguita prima e dovrebbe segnalare la migrazione nella raccolta Migrations una volta eseguita.

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

Si potrebbe estendere questa tecnica per sostenere le migrazioni (cercare l'esistenza di un dato migrazione e invertire tale tendenza), applicare un criterio di ordinamento sulle migrazioni, e dividere ogni migrazione in un file separato se si voleva.

Sarebbe interessante pensare a un pacchetto intelligente per l'automazione di questo.

+0

Alla fine potrei ottenere la motivazione per creare un pacchetto intelligente con questa logica. Questo è ancora meglio di un oscuro metodo Meteor. – wizonesolutions

+0

Se si dispone di più server in esecuzione sullo stesso database (più server Web o micro-servizi), è possibile che si verifichino problemi quando 5 server eseguono la stessa query. Questo pacchetto sembra utilizzare un [meccanismo di blocco] (https://github.com/percolatestudio/meteor-migrations/blob/master/migrations_server.js#L159) –

4

Ho creato un pacchetto intelligente per questo caso d'uso.
Vedi https://atmosphere.meteor.com/package/migrations

+5

C'è anche https://github.com/percolatestudio/meteor- migrazioni che mi sembrano avere un design più pulito di https://github.com/rantav/meteor-migrations. –

5

Come Aram sottolineato già nel commento, pacchetto p ercolate:migrations ti dà quello che ti serve. Esempio

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